A. Chewbaсca and Number
签到题
//#pragma comment(linker, "/STACK:102400000,102400000") 手动扩栈
#include<iostream>
#include<algorithm>
#include <queue>
#include<stack>
#include<map>
#include<string>
#include<set>
#include<vector>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define N 100
char s[N];
int main()
{
int n,m;
cin>>s;
int len = strlen(s);
for(int i=0;i<len;i++)
{
if(i==0&&s[i]=='9') continue;
if(s[i] > '9'-s[i]+'0') s[i]='9'-s[i]+'0';
//printf("%c %c\n",s[i],)
}
cout<<s<<endl;
return 0;
}
B. Han Solo and Lazer Gun
注意精度
#include<iostream>
#include<algorithm>
#include <queue>
#include<stack>
#include<map>
#include<string>
#include<set>
#include<vector>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define mem(a) memset(a,0,sizeof(a))
#define ok1 printf("ok1\n");
#define ok2 printf("ok2\n");
#define orz printf("orz...\n");
#define eps 1e-6
#define PI acos(-1.0)
#define N 1000+10
set<int> s;
set<int> de;
set<int>::iterator it;
double x[N],y[N];
int cmp(double x)
{
if( fabs(x) < eps) return 1;
return 0;
}
int main()
{
int n;
double tx,ty;
double ttx,tty;
s.clear();
cin>>n>>x[0]>>y[0];
for(int i=1;i<=n;i++){
scanf("%lf%lf",&x[i],&y[i]);
s.insert(i);
}
int ans= 0 ;
while(!s.empty())
{
de.clear();
it = s.begin();
ans++;
tx = x[*it]; ty = y[*it];
for(;it!=s.end();it++)
{
ttx = x[*it]; tty=y[*it];
if(cmp( (ty-y[0])*(ttx-tx)-(tty-ty)*(tx-x[0]) ) )
de.insert(*it);
}
for(it=de.begin();it!=de.end();it++)
s.erase(*it);
}
cout<<ans<<endl;
return 0;
}
C. Watto and Mechanism
Trie树 + dfs搜索
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 6*100000+10;
const int maxnode = 6*100000+10;
const int sigma_size = 4;
int len;
char s[N];
struct Trie
{
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
Trie() {sz=1;memset(ch[0],0,sizeof(ch[0])); }
int idx(char x) {return x-'a';}
void insert(char *s,int v) // v is the value of s
{
int u = 0,n = strlen(s);
for(int i=0;i<n;i++)
{
int c = idx(s[i]);
if(!ch[u][c])
{
memset(ch[sz],0,sizeof(ch[sz]));
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
}
};
Trie t;
int dfs(char *s,int u,int id,int f)
{
if(id==len)
{
if(f==1 && t.val[u]) return 1;
return 0;
}
//cout<<id<<" f="<<f<<"\n";
int c = t.idx(s[id]);
int c1 = (c+1)%3;
int c2 = (c+2)%3;
//cout<<"i'm checking "<<c<<" "<<t.ch[u][c]<<endl;
if(t.ch[u][c] && dfs(s,t.ch[u][c],id+1,f)) return 1;
if(t.ch[u][c1] && f==0 && dfs(s,t.ch[u][c1],id+1,1) ) return 1;
if(t.ch[u][c2] && f==0 && dfs(s,t.ch[u][c2],id+1,1) ) return 1;
//cout<<"over in "<<id<<endl;
return 0;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
scanf("%s",s);
t.insert(s,1);
}
for(int i=1;i<=m;i++)
{
scanf("%s",s);
len = strlen(s);
if( dfs(s,0,0,0)==1 ) puts("YES");
else puts("NO");
}
return 0;
}
D. R2D2 and Droid Army
RMQ_ST + 维护一个连续区间(队列)
//#pragma comment(linker, "/STACK:102400000,102400000") 手动扩栈
#include<iostream>
#include<algorithm>
#include <queue>
#include<stack>
#include<map>
#include<string>
#include<set>
#include<vector>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define INF 2000000002
#define pow(a,b,c,d) (a-c)*(a-c)+(b-d)*(b-d)
#define swap(a,b) (a^=b,b^=a,a^=b)
#define sca(a) scanf("%d",&a)
#define mem(a) memset(a,0,sizeof(a))
#define ok1 printf("ok1\n");
#define ok2 printf("ok2\n");
#define orz printf("orz...\n");
#define eps 1e-8
#define PI acos(-1.0)
//求区间最值问题(原数值不改变)
const int N = 100000+10;
const int M = 100 ;
int n,m;
int a[6][N];
int dp[6][N][M]; // dp[i][j] 为从 i 开始 ,长度为 2^j 的区间内 最值
long long ans[6];
void RMQ_init()
{
for(int k=1;k<=m;k++){
for(int i=1;i<=n;i++) dp[k][i][0] = a[k][i];
for(int j=1;(1<<j)<=n;j++)
for(int i=1; i+(1<<j)-1<=n ;i++)
dp[k][i][j] = max(dp[k][i][j-1],dp[k][i+(1<<(j-1))][j-1]);
}
}
int RMQ_ST(int kk,int l,int r)
{
int k = 0;
while( (1<<(k+1)) <= r-l+1 ) k++;
return max(dp[kk][l][k],dp[kk][r-(1<<k)+1][k]);
}
int main()
{
long long k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[j][i]);
RMQ_init();
int l=1,r=1;
int sans=-1;
memset(ans,0,sizeof(ans));
while(r<=n)
{
int sum=0;
for(int i=1;i<=m;i++){
sum+=RMQ_ST(i,l,r);
}
if(sum > k){
l++;
while(r<l) r++;
}
else{
if(r-l+1 >= sans){
for(int i=1;i<=m;i++)
ans[i]=RMQ_ST(i,l,r);
sans = max(sans,r-l+1);
}
r++;
}
}
int ss=0;
for(int i=1;i<=m-1;i++){
cout<<ans[i]<<" ";
ss+=ans[i];
}
cout<<ans[m];
cout<<endl;
return 0;
}