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; }
时间: 2024-10-12 19:32:30