c被fst了。。。。。。。。。。。。。。。。
然后掉到600+.。。。
然后。。。估计得绿名了。。
sad
题意:让你判断1~n个数哪个数没有出现。。
sb题。。。开个数组即可。。
#include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> using namespace std; #define rep(i, n) for(int i=0; i<(n); ++i) #define for1(i,a,n) for(int i=(a);i<=(n);++i) #define for2(i,a,n) for(int i=(a);i<(n);++i) #define for3(i,a,n) for(int i=(a);i>=(n);--i) #define for4(i,a,n) for(int i=(a);i>(n);--i) #define CC(i,a) memset(i,a,sizeof(i)) #define read(a) a=getint() #define print(a) printf("%d", a) #define dbg(x) cout << #x << " = " << x << endl #define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; } inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } inline const int max(const int &a, const int &b) { return a>b?a:b; } inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=105; int a[N], n, p, q; int main() { read(n); read(p); for1(i, 1, p) a[getint()]=1; read(q); for1(i, 1, q) a[getint()]=1; for1(i, 1, n) if(!a[i]) { puts("Oh, my keyboard!"); return 0; } puts("I become the guy."); return 0; }
题意:给你p个闭区间和q个闭区间,然后给你l和r,让你求有多少个在l-r的时间满足 将q个区间的前后加上这个时间,与p个区间有交。
枚举l~r,然后用前缀和搞搞就行了
#include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> using namespace std; #define rep(i, n) for(int i=0; i<(n); ++i) #define for1(i,a,n) for(int i=(a);i<=(n);++i) #define for2(i,a,n) for(int i=(a);i<(n);++i) #define for3(i,a,n) for(int i=(a);i>=(n);--i) #define for4(i,a,n) for(int i=(a);i>(n);--i) #define CC(i,a) memset(i,a,sizeof(i)) #define read(a) a=getint() #define print(a) printf("%d", a) #define dbg(x) cout << #x << " = " << x << endl #define printarr2(a, b, c) for1(t, 1, b) { for1(u, 1, c) cout << a[t][u]; cout << endl; } #define printarr1(a, b) for1(t, 0, b) cout << a[t] << ' '; cout << endl inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } inline const int max(const int &a, const int &b) { return a>b?a:b; } inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=1005; struct dat { int x, y; }a[N], b[N]; int p, q, l, r, ans, vis[N+N], mx; int main() { read(p); read(q); read(l); read(r); for1(i, 1, p) read(a[i].x), read(a[i].y), mx=max(mx, a[i].y); for1(i, 1, q) read(b[i].x), read(b[i].y), mx=max(mx, b[i].y); for1(i, l, r) { CC(vis, 0); for1(j, 1, p) ++vis[a[j].x], --vis[a[j].y+1]; for1(j, 1, q) ++vis[b[j].x+i], --vis[b[j].y+1+i]; int sum=0; for1(k, 0, mx) { sum+=vis[k]; if(sum>1) { ++ans; break; } } } print(ans); return 0; }
C.24 Game
题意:给你n个数,分别为1~n,让你通过每次+-×两个数,然后加入到原集合中,最后剩一个数为24。。并且输出一个可行方案。。
到后边才发现。。。。只要会做1234或12345的24即可。。。后边的那些全部可以变成0或者变成1.。。。
我是写变成1的,,然后有个地方没特判,喜闻乐见被fst了。。
(我还去hack别人。。。sad。。自己的都fst了。。
#include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> using namespace std; #define rep(i, n) for(int i=0; i<(n); ++i) #define for1(i,a,n) for(int i=(a);i<=(n);++i) #define for2(i,a,n) for(int i=(a);i<(n);++i) #define for3(i,a,n) for(int i=(a);i>=(n);--i) #define for4(i,a,n) for(int i=(a);i>(n);--i) #define CC(i,a) memset(i,a,sizeof(i)) #define read(a) a=getint() #define print(a) printf("%d", a) #define dbg(x) cout << #x << " = " << x << endl #define printarr2(a, b, c) for1(i, 1, b) { for1(j, 1, c) cout << a[i][j]; cout << endl; } #define printarr1(a, b) for1(i, 1, b) cout << a[i]; cout << endl inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } inline const int max(const int &a, const int &b) { return a>b?a:b; } inline const int min(const int &a, const int &b) { return a<b?a:b; } int n, beg=5, cnt, tot, ck; int main() { read(n); if(n<4) { puts("NO"); return 0; } puts("YES"); if(n&1) beg=6; for(int i=beg; i<=n; i+=2) { printf("%d - %d = 1 ", i+1, i); ++cnt; } tot+=cnt; int t=cnt/2; bool flag=cnt&1; cnt=0; for1(i, 1, t) printf("1 - 1 = 0 "), ++cnt; tot+=cnt; if(flag) printf("1 * 1 = 1 "), ++tot; ck=tot; for1(i, beg, n-tot-1) printf("0 + 0 = 0 "), ++ck; if(beg==6) { if(n>5 && n-1-ck==5) printf("5 + 0 = 5 "); printf("5 * 3 = 15 "); printf("2 * 4 = 8 "); printf("15 + 8 = 23 "); printf("23 + 1 = 24 "); } else { if(n>4 && n-1-ck==4) printf("4 + 0 = 4 "); printf("1 + 2 = 3 "); printf("3 + 3 = 6 "); printf("6 * 4 = 24 "); } return 0; }
D.Two Sets
题意:给你n个数,在满足约束的条件下将所有数都分到对应的集合里。判断是否有解。
想到二分图,但是貌似我都不会建图?(没时间了。。。)
然后听说还可以模拟?正解是2sat?。。。orz
被吓cry。。。。。。。。这题用并查集。。
开两个并查集然后模拟加入,最后判断A和B集是否重合即可。。
#include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> #include <map> #include <set> using namespace std; #define rep(i, n) for(int i=0; i<(n); ++i) #define for1(i,a,n) for(int i=(a);i<=(n);++i) #define for2(i,a,n) for(int i=(a);i<(n);++i) #define for3(i,a,n) for(int i=(a);i>=(n);--i) #define for4(i,a,n) for(int i=(a);i>(n);--i) #define CC(i,a) memset(i,a,sizeof(i)) #define read(a) a=getint() #define print(a) printf("%d", a) #define dbg(x) cout << #x << " = " << x << endl #define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; } inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; } inline const int max(const int &a, const int &b) { return a>b?a:b; } inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=100015; map<int, int> mp; set<int> s; int x[N], n, a, b, p[N], tot; const int ifind(const int &x) { return x==p[x]?x:p[x]=ifind(p[x]); } int main() { read(n); read(a); read(b); for1(i, 1, n) { read(x[i]); s.insert(x[i]); mp[x[i]]=++tot; } for1(i, 1, n+2) p[i]=i; for1(i, 1, n) { if(s.count(a-x[i])) { p[ifind(mp[a-x[i]])]=p[ifind(mp[x[i]])]; } else p[ifind(mp[x[i]])]=p[ifind(n+1)]; if(s.count(b-x[i])) { p[ifind(mp[b-x[i]])]=p[ifind(mp[x[i]])]; } else p[ifind(mp[x[i]])]=p[ifind(n+2)]; } if(ifind(n+1)==ifind(n+2)) { puts("NO"); return 0; } puts("YES"); for1(i, 1, n) printf("%d ", ifind(mp[x[i]])==ifind(n+1)); return 0; }
E.Hack it!
没看题。。。。