hdu 多校 2018 第十场
1001 OI业界毒瘤题(把收藏已久的blog拿出来就好了,反正现场赛也不会写(逃
1004 BPM136 是不是dls写的题解啊,什么是转移很显然啊(
f_i_j_k 表示考虑前i个位置,有j条出边,j条入边,权值为k的个数(就是看成点i向pi连边,连abs(i-pi)的边,那么一定是一堆的环)
转移的时候,因为有j条边没有搞定,所以每次权值往k+j转移,因为这些边的距离又远了1
然后要么自己结束一条边,要么自己用未来的点连,那么多出一条边,或者是自己自交(雾
这么看的话转移就真的很显然啦qwqqqqqqqq
1 #define get(a,i) ((a)&(1<<(i-1))) 2 #define PAU putchar(32) 3 #define ENT putchar(10) 4 #define all(x) ((int) (x).size()) 5 #define clr(a,b) memset(a,b,sizeof(a)) 6 #define rep(_i,_a,_b) for(int _i=(_a);_i<=(_b);_i++) 7 #define down(_i,_a,_b) for(int _i=(_a);_i>=(_b);_i--) 8 #define FOR(_i,_b) for(int _i=1;_i<=(_b);_i++) 9 #define efo(_i,_a) for(int _i=last[(_a)];_i!=0;_i=e[_i].next) 10 #define Remax(a,b) if(b>a) a=b; 11 #define Remin(a,b) if(b<a) a=b; 12 #define SZ(x) ((int)(x).size()) 13 #define filein(x) freopen(#x".in","r",stdin) 14 #define fileout(x) freopen(#x".out","w",stdout) 15 #define file(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout); 16 #define mkd(x) freopen(#x".in","w",stdout); 17 #define setlargestack(x) int _SIZE=x<<20;char *_PPP=(char*)malloc(_SIZE)+_SIZE;__asm__("movl %0, %%esp\n" :: "r"(_PPP)); 18 #define END system("pause") 19 #define read2(a,b) read(a),read(b) 20 #define read3(a,b,c) read(a),read(b),read(c) 21 #define readg(_x1,_y1,_x2,_y2) read(_x1),read(_y1),read(_x2),read(_y2) 22 #define use_cin_cout cin.sync_with_stdio(0),cout.sync_with_stdio(0),cerr.sync_with_stdio(0) 23 using namespace std; 24 25 typedef long long ll; 26 typedef double DB; 27 typedef long double LD; 28 typedef unsigned int UI; 29 typedef unsigned long long ULL; 30 typedef vector<int> VI; 31 typedef vector<ll> VLL; 32 typedef set<int> SI; 33 typedef set<ll> SLL; 34 typedef set<int , greater<int> > SIG; 35 typedef set<ll , greater<ll> > SLLG; 36 typedef map<int, int > MII; 37 typedef map<int, int, greater<int> > MIIG; 38 typedef map<ll, ll > MLLLL; 39 typedef map<ll, ll, greater<ll> > MLLLLG; 40 41 const int N = 105; 42 43 int f[2][N][N * N]; 44 int n,MOD; 45 46 int main() { 47 use_cin_cout; 48 int T; cin >> T; 49 while(T --) { 50 cin >> n >> MOD; 51 52 clr(f, 0); 53 int now = 0; 54 f[now][0][0] = 1; f[now][1][0] = 1; 55 rep(i, 1, n - 1) { 56 now = 1 - now; 57 clr(f[now], 0); 58 rep(j, 0, i) rep(k, 0, i * i) if(f[j][k] > 0) { 59 (f[now][j][k + j] += (ll) (2 * j + 1) * f[1 - now][j][k] % MOD) %= MOD; 60 if(j - 1 >= 0) (f[now][j - 1][k + j] += (ll) j * j * f[1 - now][j][k] % MOD) %= MOD; 61 (f[now][j + 1][k + j] += f[1 - now][j][k]) %= MOD; 62 } 63 } 64 cout << f[now][0][0]; 65 rep(i, 1, n * n - 1) { 66 cout << ' '; 67 if(i & 1) cout << 0; else cout << f[now][0][i / 2]; 68 } 69 cout << '\n'; 70 } 71 return 0; 72 }
1005 BPM136 考虑从大到小枚举每一个答案,把可能是答案的点构造一棵虚树(并不用完全建出来),那么虚树上所有不是叶子节点的点答案就是你枚举的答案(找的虚树板子居然没写lca为根的情况,还是要自己整理板子才行
1 /* *********************************************** 2 Author :BPM136 3 Created Time :2018/8/22 13:21:06 4 File Name :1005.cpp 5 ************************************************ */ 6 7 #include<iostream> 8 #include<cstdio> 9 #include<algorithm> 10 #include<cstdlib> 11 #include<cmath> 12 #include<cstring> 13 #include<iomanip> 14 #include<bitset> 15 #include<queue> 16 #include<ctime> 17 #include<set> 18 #include<map> 19 #include<list> 20 #include<vector> 21 #include<cassert> 22 #include<functional> 23 #include<string> 24 #define pb push_back 25 #define popb pop_back 26 #define MID ((l+r)>>1) 27 #define LSON (k<<1) 28 #define RSON (k<<1|1) 29 #define get(a,i) ((a)&(1<<(i-1))) 30 #define PAU putchar(32) 31 #define ENT putchar(10) 32 #define all(x) ((int) (x).size()) 33 #define clr(a,b) memset(a,b,sizeof(a)) 34 #define rep(_i,_a,_b) for(int _i=(_a);_i<=(_b);_i++) 35 #define down(_i,_a,_b) for(int _i=(_a);_i>=(_b);_i--) 36 #define FOR(_i,_b) for(int _i=1;_i<=(_b);_i++) 37 #define efo(_i,_a) for(int _i=last[(_a)];_i!=0;_i=e[_i].next) 38 #define Remax(a,b) if(b>a) a=b; 39 #define Remin(a,b) if(b<a) a=b; 40 #define SZ(x) ((int)(x).size()) 41 #define filein(x) freopen(#x".in","r",stdin) 42 #define fileout(x) freopen(#x".out","w",stdout) 43 #define file(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout); 44 #define mkd(x) freopen(#x".in","w",stdout); 45 #define setlargestack(x) int _SIZE=x<<20;char *_PPP=(char*)malloc(_SIZE)+_SIZE;__asm__("movl %0, %%esp\n" :: "r"(_PPP)); 46 #define END system("pause") 47 #define read2(a,b) read(a),read(b) 48 #define read3(a,b,c) read(a),read(b),read(c) 49 #define readg(_x1,_y1,_x2,_y2) read(_x1),read(_y1),read(_x2),read(_y2) 50 #define use_cin_cout cin.sync_with_stdio(0),cout.sync_with_stdio(0),cerr.sync_with_stdio(0) 51 using namespace std; 52 53 typedef long long ll; 54 typedef double DB; 55 typedef long double LD; 56 typedef unsigned int UI; 57 typedef unsigned long long ULL; 58 typedef vector<int> VI; 59 typedef vector<ll> VLL; 60 typedef set<int> SI; 61 typedef set<ll> SLL; 62 typedef set<int , greater<int> > SIG; 63 typedef set<ll , greater<ll> > SLLG; 64 typedef map<int, int > MII; 65 typedef map<int, int, greater<int> > MIIG; 66 typedef map<ll, ll > MLLLL; 67 typedef map<ll, ll, greater<ll> > MLLLLG; 68 69 namespace fastIO{ 70 #define BUF_SIZE 100000 71 #define OUT_SIZE 100000 72 //fread->read 73 bool IOerror=0; 74 inline char nc(){ 75 static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE; 76 if (p1==pend){ 77 p1=buf; pend=buf+fread(buf,1,BUF_SIZE,stdin); 78 if (pend==p1){IOerror=1;return -1;} 79 //{printf("IO error!\n");system("pause");for (;;);exit(0);} 80 } 81 return *p1++; 82 } 83 inline bool blank(char ch){return ch==32||ch==10||ch==13||ch==9;} 84 inline bool enter(char ch){return ch==10||ch==13;} 85 inline void read(int &x){ 86 bool sign=0; char ch=nc(); x=0; 87 for (;blank(ch);ch=nc()); 88 if (IOerror)return; 89 if (ch==45)sign=1,ch=nc(); 90 for (;ch>=48&&ch<=57;ch=nc())x=x*10+ch-48; 91 if (sign)x=-x; 92 } 93 inline void read(ll &x){ 94 bool sign=0; char ch=nc(); x=0; 95 for (;blank(ch);ch=nc()); 96 if (IOerror)return; 97 if (ch==45)sign=1,ch=nc(); 98 for (;ch>=48&&ch<=57;ch=nc())x=x*10+ch-48; 99 if (sign)x=-x; 100 } 101 inline void read(double &x){ 102 bool sign=0; char ch=nc(); x=0; 103 for (;blank(ch);ch=nc()); 104 if (IOerror)return; 105 if (ch==45)sign=1,ch=nc(); 106 for (;ch>=48&&ch<=57;ch=nc())x=x*10+ch-48; 107 if (ch==46){ 108 double tmp=1; ch=nc(); 109 for (;ch>=48&&ch<=57;ch=nc())tmp/=10.0,x+=tmp*(ch-48); 110 } 111 if (sign)x=-x; 112 } 113 inline void read(char *s){ 114 char ch=nc(); 115 for (;blank(ch);ch=nc()); 116 if (IOerror)return; 117 for (;!blank(ch)&&!IOerror;ch=nc())*s++=ch; 118 *s=0; 119 } 120 inline void read(char *s,bool f) { 121 char ch=nc(); 122 for (;blank(ch);ch=nc()); 123 if(IOerror)return; 124 for(;!enter(ch)&&!IOerror;ch=nc())*s++=ch; 125 *s=0; 126 } 127 inline void read(char &c){ 128 for (c=nc();blank(c);c=nc()); 129 if (IOerror){c=-1;return;} 130 } 131 #undef OUT_SIZE 132 #undef BUF_SIZE 133 }; using namespace fastIO; 134 135 const int N = 100005; 136 const int LOGN = 20; 137 138 struct edge { 139 int y,next; 140 }e[N],_e[N]; 141 int last[N],ne; 142 int ans[N]; 143 int n; 144 145 void add(int x,int y) { 146 e[++ne].y=y; e[ne].next=last[x]; last[x]=ne; 147 } 148 149 150 VI tot[N]; 151 152 int fa[N][LOGN]; 153 int dep[N]; 154 int dfn[N],timed=0; 155 int get_lca(int x,int y) { 156 if(dep[x]<dep[y]) swap(x,y); 157 for(int i=LOGN-1;i>=0;i--) if(dep[fa[x][i]]>=dep[y]) x=fa[x][i]; 158 if(x==y) return x; 159 for(int i=LOGN-1;i>=0;i--) if(fa[x][i]!=fa[y][i]) { 160 x=fa[x][i]; 161 y=fa[y][i]; 162 } 163 return fa[x][0]; 164 } 165 void dfs(int x) { 166 dfn[x]=++timed; 167 for(int i=1;i<LOGN;i++) fa[x][i]=fa[ fa[x][i-1] ][i-1]; 168 for(int i=last[x];i!=0;i=e[i].next) if(e[i].y!=fa[x][0]) { 169 fa[e[i].y][0]=x; 170 dep[e[i].y]=dep[x]+1; 171 dfs(e[i].y); 172 } 173 } 174 175 bool cmp(int a,int b) { 176 return dfn[a]<dfn[b]; 177 } 178 179 int sta[N<<1],top; 180 void work(int *pt,int &cnt,int val) { 181 sort(pt+1,pt+cnt+1,cmp); 182 top=0; 183 int f; 184 for(int i=1,cntp=cnt;i<=cntp;i++) { 185 if(top==0) {sta[++top]=pt[i]; continue;} 186 f=get_lca(pt[i],sta[top]); 187 while(top>1 && dep[f]<dep[sta[top-1]]) { 188 top--; 189 ans[sta[top]]=max(ans[sta[top]],val); 190 } 191 if(dep[f]<dep[sta[top]]) top--; 192 if((top>0 && sta[top]!=f) || top==0) sta[++top]=f,pt[++cnt]=f; 193 sta[++top]=pt[i]; 194 } 195 while(top>1) { 196 top--; 197 ans[sta[top]]=max(ans[sta[top]],val); 198 } 199 } 200 201 int tmp[N*4]; 202 int main() { 203 read(n); 204 rep(i,2,n) { 205 int x; read(x); 206 add(x,i); 207 } 208 int mx=0; 209 rep(i,1,n) { 210 int x; read(x); 211 tot[x].pb(i); 212 mx=max(mx,x); 213 } 214 dep[1]=1; 215 dfs(1); 216 clr(ans,-1); 217 down(i,mx,1) { 218 int cnt=0; 219 for(int j=i;j<=mx;j+=i) { 220 for(auto k : tot[j]) tmp[++cnt]=k; 221 } 222 work(tmp,cnt,i); 223 } 224 rep(i,1,n) printf("%d\n",ans[i]); 225 return 0; 226 }
1007 小甜甜 暴力(
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <string.h> 11 #include <stdlib.h> 12 #include <time.h> 13 #include <climits> 14 15 using namespace std; 16 17 const int mod=998244353; 18 const int maxN=1e5+7; 19 20 int n; 21 long long a[maxN]; 22 bool vis[10000]; 23 int ans; 24 25 void dfs(int k){ 26 if (k>n) { 27 a[k]=a[1]; 28 for (int i=1;i<=n;i++) 29 if (a[i]%n+1==a[i+1]) return; 30 ans++; 31 return ; 32 } 33 34 for (int i=1;i<=n;i++) if (!vis[i]) { 35 a[k]=i; 36 vis[i]=1; 37 dfs(k+1); 38 vis[i]=0; 39 } 40 } 41 42 void baoli(){ 43 ans=0; 44 a[1]=1; 45 vis[1]=1; 46 dfs(2); 47 cout<<ans<<endl; 48 } 49 50 int main(){ 51 /* 52 for (int i=1;i<=10;i++) { 53 n=i; 54 printf("%d:",i); 55 baoli(); 56 } 57 */ 58 59 60 a[1]=1; 61 a[2]=0; 62 a[3]=1; 63 for (int i=4;i<maxN;i++) { 64 a[i]=(i-2)*a[i-1]%mod+(i-1)*a[i-2]%mod; 65 if (i&1) a[i]=(a[i]+1)%mod; 66 else a[i]=(a[i]-1+mod)%mod; 67 } 68 69 int T; 70 scanf("%d",&T); 71 while (T--) { 72 int n; 73 scanf("%d",&n); 74 printf("%lld\n",a[n]); 75 } 76 77 return 0; 78 }
1008 小甜甜 答案显然
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <string.h> 11 #include <stdlib.h> 12 #include <time.h> 13 #include <climits> 14 15 using namespace std; 16 17 #define ll long long 18 19 #define MAXN 9999 20 #define MAXSIZE 10000 21 #define DLEN 4 22 23 class BigNum 24 { 25 private: 26 int a[MAXSIZE]; //可以控制大数的位数 27 int len; //大数长度 28 public: 29 BigNum(){ len = 1;memset(a,0,sizeof(a)); } //构造函数 30 BigNum(const int); //将一个int类型的变量转化为大数 31 BigNum(const char*); //将一个字符串类型的变量转化为大数 32 BigNum(const BigNum &); //拷贝构造函数 33 BigNum &operator=(const BigNum &); //重载赋值运算符,大数之间进行赋值运算 34 35 friend istream& operator>>(istream&, BigNum&); //重载输入运算符 36 friend ostream& operator<<(ostream&, BigNum&); //重载输出运算符 37 38 BigNum operator+(const BigNum &) const; //重载加法运算符,两个大数之间的相加运算 39 BigNum operator-(const BigNum &) const; //重载减法运算符,两个大数之间的相减运算 40 BigNum operator*(const BigNum &) const; //重载乘法运算符,两个大数之间的相乘运算 41 BigNum operator/(const int &) const; //重载除法运算符,大数对一个整数进行相除运算 42 43 BigNum operator^(const int &) const; //大数的n次方运算 44 int operator%(const int &) const; //大数对一个int类型的变量进行取模运算 45 bool operator>(const BigNum & T)const; //大数和另一个大数的大小比较 46 bool operator>(const int & t)const; //大数和一个int类型的变量的大小比较 47 48 void print(); //输出大数 49 }; 50 BigNum::BigNum(const int b) //将一个int类型的变量转化为大数 51 { 52 int c,d = b; 53 len = 0; 54 memset(a,0,sizeof(a)); 55 while(d > MAXN) 56 { 57 c = d - (d / (MAXN + 1)) * (MAXN + 1); 58 d = d / (MAXN + 1); 59 a[len++] = c; 60 } 61 a[len++] = d; 62 } 63 BigNum::BigNum(const char*s) //将一个字符串类型的变量转化为大数 64 { 65 int t,k,index,l,i; 66 memset(a,0,sizeof(a)); 67 l=strlen(s); 68 len=l/DLEN; 69 if(l%DLEN) 70 len++; 71 index=0; 72 for(i=l-1;i>=0;i-=DLEN) 73 { 74 t=0; 75 k=i-DLEN+1; 76 if(k<0) 77 k=0; 78 for(int j=k;j<=i;j++) 79 t=t*10+s[j]-'0'; 80 a[index++]=t; 81 } 82 } 83 BigNum::BigNum(const BigNum & T) : len(T.len) //拷贝构造函数 84 { 85 int i; 86 memset(a,0,sizeof(a)); 87 for(i = 0 ; i < len ; i++) 88 a[i] = T.a[i]; 89 } 90 BigNum & BigNum::operator=(const BigNum & n) //重载赋值运算符,大数之间进行赋值运算 91 { 92 int i; 93 len = n.len; 94 memset(a,0,sizeof(a)); 95 for(i = 0 ; i < len ; i++) 96 a[i] = n.a[i]; 97 return *this; 98 } 99 istream& operator>>(istream & in, BigNum & b) //重载输入运算符 100 { 101 char ch[MAXSIZE*4]; 102 int i = -1; 103 in>>ch; 104 int l=strlen(ch); 105 int count=0,sum=0; 106 for(i=l-1;i>=0;) 107 { 108 sum = 0; 109 int t=1; 110 for(int j=0;j<4&&i>=0;j++,i--,t*=10) 111 { 112 sum+=(ch[i]-'0')*t; 113 } 114 b.a[count]=sum; 115 count++; 116 } 117 b.len =count++; 118 return in; 119 120 } 121 /*ostream& operator<<(ostream& out, BigNum& b) //重载输出运算符 122 { 123 int i; 124 cout << b.a[b.len - 1]; 125 for(i = b.len - 2 ; i >= 0 ; i--) 126 { 127 cout.width(DLEN); 128 cout.fill('0'); 129 cout << b.a[i]; 130 } 131 return out; 132 }*/ 133 134 BigNum BigNum::operator+(const BigNum & T) const //两个大数之间的相加运算 135 { 136 BigNum t(*this); 137 int i,big; //位数 138 big = T.len > len ? T.len : len; 139 for(i = 0 ; i < big ; i++) 140 { 141 t.a[i] +=T.a[i]; 142 if(t.a[i] > MAXN) 143 { 144 t.a[i + 1]++; 145 t.a[i] -=MAXN+1; 146 } 147 } 148 if(t.a[big] != 0) 149 t.len = big + 1; 150 else 151 t.len = big; 152 return t; 153 } 154 BigNum BigNum::operator-(const BigNum & T) const //两个大数之间的相减运算 155 { 156 int i,j,big; 157 bool flag; 158 BigNum t1,t2; 159 if(*this>T) 160 { 161 t1=*this; 162 t2=T; 163 flag=0; 164 } 165 else 166 { 167 t1=T; 168 t2=*this; 169 flag=1; 170 } 171 big=t1.len; 172 for(i = 0 ; i < big ; i++) 173 { 174 if(t1.a[i] < t2.a[i]) 175 { 176 j = i + 1; 177 while(t1.a[j] == 0) 178 j++; 179 t1.a[j--]--; 180 while(j > i) 181 t1.a[j--] += MAXN; 182 t1.a[i] += MAXN + 1 - t2.a[i]; 183 } 184 else 185 t1.a[i] -= t2.a[i]; 186 } 187 t1.len = big; 188 while(t1.a[len - 1] == 0 && t1.len > 1) 189 { 190 t1.len--; 191 big--; 192 } 193 if(flag) 194 t1.a[big-1]=0-t1.a[big-1]; 195 return t1; 196 } 197 198 BigNum BigNum::operator*(const BigNum & T) const //两个大数之间的相乘运算 199 { 200 BigNum ret; 201 int i,j,up; 202 int temp,temp1; 203 for(i = 0 ; i < len ; i++) 204 { 205 up = 0; 206 for(j = 0 ; j < T.len ; j++) 207 { 208 temp = a[i] * T.a[j] + ret.a[i + j] + up; 209 if(temp > MAXN) 210 { 211 temp1 = temp - temp / (MAXN + 1) * (MAXN + 1); 212 up = temp / (MAXN + 1); 213 ret.a[i + j] = temp1; 214 } 215 else 216 { 217 up = 0; 218 ret.a[i + j] = temp; 219 } 220 } 221 if(up != 0) 222 ret.a[i + j] = up; 223 } 224 ret.len = i + j; 225 while(ret.a[ret.len - 1] == 0 && ret.len > 1) 226 ret.len--; 227 return ret; 228 } 229 BigNum BigNum::operator/(const int & b) const //大数对一个整数进行相除运算 230 { 231 BigNum ret; 232 int i,down = 0; 233 for(i = len - 1 ; i >= 0 ; i--) 234 { 235 ret.a[i] = (a[i] + down * (MAXN + 1)) / b; 236 down = a[i] + down * (MAXN + 1) - ret.a[i] * b; 237 } 238 ret.len = len; 239 while(ret.a[ret.len - 1] == 0 && ret.len > 1) 240 ret.len--; 241 return ret; 242 } 243 int BigNum::operator %(const int & b) const //大数对一个int类型的变量进行取模运算 244 { 245 int i,d=0; 246 for (i = len-1; i>=0; i--) 247 { 248 d = ((d * (MAXN+1))% b + a[i])% b; 249 } 250 return d; 251 } 252 BigNum BigNum::operator^(const int & n) const //大数的n次方运算 253 { 254 BigNum t,ret(1); 255 int i; 256 if(n<0) 257 exit(-1); 258 if(n==0) 259 return 1; 260 if(n==1) 261 return *this; 262 int m=n; 263 while(m>1) 264 { 265 t=*this; 266 for( i=1;i<<1<=m;i<<=1) 267 { 268 t=t*t; 269 } 270 m-=i; 271 ret=ret*t; 272 if(m==1) 273 ret=ret*(*this); 274 } 275 return ret; 276 } 277 bool BigNum::operator>(const BigNum & T) const //大数和另一个大数的大小比较 278 { 279 int ln; 280 if(len > T.len) 281 return true; 282 else if(len == T.len) 283 { 284 ln = len - 1; 285 while(a[ln] == T.a[ln] && ln >= 0) 286 ln--; 287 if(ln >= 0 && a[ln] > T.a[ln]) 288 return true; 289 else 290 return false; 291 } 292 else 293 return false; 294 } 295 bool BigNum::operator >(const int & t) const //大数和一个int类型的变量的大小比较 296 { 297 BigNum b(t); 298 return *this>b; 299 } 300 301 void BigNum::print() //输出大数 302 { 303 int i; 304 //cout << a[len - 1]; 305 printf("%d",a[len-1]); 306 for(i = len - 2 ; i >= 0 ; i--) 307 { 308 /*cout.width(DLEN); 309 cout.fill('0'); 310 cout << a[i];*/ 311 printf("%04d",a[i]); 312 } 313 //cout << endl; 314 printf("\n"); 315 } 316 317 BigNum ans[2007]; 318 319 int main(){ 320 ans[0]=BigNum(1); 321 for (int i=1;i<=2000;i++) ans[i]=ans[i-1]*2; 322 323 int T; 324 scanf("%d",&T); 325 while (T--) { 326 int n; 327 scanf("%d",&n); 328 ans[n].print(); 329 } 330 return 0; 331 }
1009 BPM136 转化一下发现和2n有关,打个表发现是phi[ 2 * n ] / 2 的前缀和(咦?
1 /* *********************************************** 2 Author :BPM136 3 Created Time :2018/8/22 16:01:27 4 File Name :1010.cpp 5 ************************************************ */ 6 7 #include<iostream> 8 #include<cstdio> 9 #include<algorithm> 10 #include<cstdlib> 11 #include<cmath> 12 #include<cstring> 13 #include<iomanip> 14 #include<bitset> 15 #include<queue> 16 #include<ctime> 17 #include<set> 18 #include<map> 19 #include<list> 20 #include<vector> 21 #include<cassert> 22 #include<functional> 23 #include<string> 24 #define pb push_back 25 #define popb pop_back 26 #define MID ((l+r)>>1) 27 #define LSON (k<<1) 28 #define RSON (k<<1|1) 29 #define get(a,i) ((a)&(1<<(i-1))) 30 #define PAU putchar(32) 31 #define ENT putchar(10) 32 #define all(x) ((int) (x).size()) 33 #define clr(a,b) memset(a,b,sizeof(a)) 34 #define rep(_i,_a,_b) for(int _i=(_a);_i<=(_b);_i++) 35 #define down(_i,_a,_b) for(int _i=(_a);_i>=(_b);_i--) 36 #define FOR(_i,_b) for(int _i=1;_i<=(_b);_i++) 37 #define efo(_i,_a) for(int _i=last[(_a)];_i!=0;_i=e[_i].next) 38 #define Remax(a,b) if(b>a) a=b; 39 #define Remin(a,b) if(b<a) a=b; 40 #define SZ(x) ((int)(x).size()) 41 #define filein(x) freopen(#x".in","r",stdin) 42 #define fileout(x) freopen(#x".out","w",stdout) 43 #define file(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout); 44 #define mkd(x) freopen(#x".in","w",stdout); 45 #define setlargestack(x) int _SIZE=x<<20;char *_PPP=(char*)malloc(_SIZE)+_SIZE;__asm__("movl %0, %%esp\n" :: "r"(_PPP)); 46 #define END system("pause") 47 #define read2(a,b) read(a),read(b) 48 #define read3(a,b,c) read(a),read(b),read(c) 49 #define readg(_x1,_y1,_x2,_y2) read(_x1),read(_y1),read(_x2),read(_y2) 50 #define use_cin_cout cin.sync_with_stdio(0),cout.sync_with_stdio(0),cerr.sync_with_stdio(0) 51 using namespace std; 52 53 typedef long long ll; 54 typedef double DB; 55 typedef long double LD; 56 typedef unsigned int UI; 57 typedef unsigned long long ULL; 58 typedef vector<int> VI; 59 typedef vector<ll> VLL; 60 typedef set<int> SI; 61 typedef set<ll> SLL; 62 typedef set<int , greater<int> > SIG; 63 typedef set<ll , greater<ll> > SLLG; 64 typedef map<int, int > MII; 65 typedef map<int, int, greater<int> > MIIG; 66 typedef map<ll, ll > MLLLL; 67 typedef map<ll, ll, greater<ll> > MLLLLG; 68 69 namespace fastIO{ 70 #define BUF_SIZE 100000 71 #define OUT_SIZE 100000 72 //fread->read 73 bool IOerror=0; 74 inline char nc(){ 75 static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE; 76 if (p1==pend){ 77 p1=buf; pend=buf+fread(buf,1,BUF_SIZE,stdin); 78 if (pend==p1){IOerror=1;return -1;} 79 //{printf("IO error!\n");system("pause");for (;;);exit(0);} 80 } 81 return *p1++; 82 } 83 inline bool blank(char ch){return ch==32||ch==10||ch==13||ch==9;} 84 inline bool enter(char ch){return ch==10||ch==13;} 85 inline void read(int &x){ 86 bool sign=0; char ch=nc(); x=0; 87 for (;blank(ch);ch=nc()); 88 if (IOerror)return; 89 if (ch==45)sign=1,ch=nc(); 90 for (;ch>=48&&ch<=57;ch=nc())x=x*10+ch-48; 91 if (sign)x=-x; 92 } 93 inline void read(ll &x){ 94 bool sign=0; char ch=nc(); x=0; 95 for (;blank(ch);ch=nc()); 96 if (IOerror)return; 97 if (ch==45)sign=1,ch=nc(); 98 for (;ch>=48&&ch<=57;ch=nc())x=x*10+ch-48; 99 if (sign)x=-x; 100 } 101 inline void read(double &x){ 102 bool sign=0; char ch=nc(); x=0; 103 for (;blank(ch);ch=nc()); 104 if (IOerror)return; 105 if (ch==45)sign=1,ch=nc(); 106 for (;ch>=48&&ch<=57;ch=nc())x=x*10+ch-48; 107 if (ch==46){ 108 double tmp=1; ch=nc(); 109 for (;ch>=48&&ch<=57;ch=nc())tmp/=10.0,x+=tmp*(ch-48); 110 } 111 if (sign)x=-x; 112 } 113 inline void read(char *s){ 114 char ch=nc(); 115 for (;blank(ch);ch=nc()); 116 if (IOerror)return; 117 for (;!blank(ch)&&!IOerror;ch=nc())*s++=ch; 118 *s=0; 119 } 120 inline void read(char *s,bool f) { 121 char ch=nc(); 122 for (;blank(ch);ch=nc()); 123 if(IOerror)return; 124 for(;!enter(ch)&&!IOerror;ch=nc())*s++=ch; 125 *s=0; 126 } 127 inline void read(char &c){ 128 for (c=nc();blank(c);c=nc()); 129 if (IOerror){c=-1;return;} 130 } 131 #undef OUT_SIZE 132 #undef BUF_SIZE 133 }; using namespace fastIO; 134 135 const int N = 40000000; 136 137 bool nop[N+5]; 138 int phi[N+5],pri[N/2]; 139 int size=0; 140 void PHI() { 141 nop[1]=1,phi[1]=0; 142 for(int i=2;i<=N;i++) 143 { 144 if(!nop[i]) pri[++size]=i,phi[i]=i-1; 145 for(int j=1;j<=size&&i*pri[j]<=N;j++) 146 { 147 nop[i*pri[j]]=1; 148 if(i%pri[j]==0) { 149 phi[i*pri[j]]=phi[i]*pri[j]; 150 break; 151 } 152 else phi[i*pri[j]]=phi[i]*(pri[j]-1); 153 } 154 } 155 } 156 157 ll ans[N/2+1]; 158 159 int main() { 160 PHI(); 161 int T; read(T); 162 rep(i,1,N/2) ans[i]=ans[i-1]+phi[i*2]/2; 163 while(T--) { 164 int x; read(x); 165 printf("%lld\n",ans[x]); 166 } 167 return 0; 168 }
1010 小甜甜 最大曼哈顿距离 暴力一下状态每个维度做就好了
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <string.h> 11 #include <stdlib.h> 12 #include <time.h> 13 #include <climits> 14 15 using namespace std; 16 17 const int maxN=1e5+7; 18 const long long INF=10000000000000000LL; 19 20 int a[maxN][6]; 21 int b[maxN][6]; 22 23 void work(){ 24 int n,m,k; 25 scanf("%d%d%d",&n,&m,&k); 26 27 for (int i=1;i<=n;i++) 28 for (int j=0;j<=k;j++) scanf("%d",&a[i][j]); 29 for (int i=1;i<=m;i++) 30 for (int j=0;j<=k;j++) scanf("%d",&b[i][j]); 31 32 long long ans=-INF; 33 34 for (int sta=0;sta<(1<<k);sta++) { 35 long long MAX=-INF; 36 for (int i=1;i<=n;i++) { 37 long long t=a[i][0]; 38 for (int j=0;j<k;j++) { 39 if (sta&(1<<j)) t+=a[i][j+1]; 40 else t-=a[i][j+1]; 41 } 42 MAX=max(MAX,t); 43 } 44 45 long long MIN=INF; 46 for (int i=1;i<=m;i++) { 47 long long t=-b[i][0]; 48 for (int j=0;j<k;j++) { 49 if (sta&(1<<j)) t+=b[i][j+1]; 50 else t-=b[i][j+1]; 51 } 52 MIN=min(MIN,t); 53 } 54 55 ans=max(ans,MAX-MIN); 56 } 57 58 printf("%lld\n",ans); 59 } 60 61 int main(){ 62 int T; 63 scanf("%d",&T); 64 while (T--) work(); 65 return 0; 66 }
1012 小甜甜 网络流
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 #include <vector> 6 #include <queue> 7 #include <set> 8 #include <map> 9 #include <string> 10 #include <string.h> 11 #include <stdlib.h> 12 #include <time.h> 13 #include <climits> 14 15 using namespace std; 16 17 const int maxN=1e4; 18 const int maxM=3e5; 19 const int INF=0x3f3f3f3f; 20 21 struct edge{ 22 int to,cap,flow,cost,nex; 23 }E[maxM]; 24 int head[maxN],edgenum; 25 26 void init() { 27 edgenum=0; 28 memset(head,-1,sizeof(head)); 29 edgenum=0; 30 } 31 32 void addedge(int u,int v,int w,int c){ 33 E[edgenum]=(edge){v,w,0,c,head[u]}; 34 head[u]=edgenum++; 35 E[edgenum]=(edge){u,0,0,-c,head[v]}; 36 head[v]=edgenum++; 37 } 38 39 //////////// 40 41 int pre[maxN]; 42 int dist[maxN]; 43 bool vis[maxN]; 44 45 bool SPFA(int s,int t){ 46 queue <int> que; 47 memset(dist,INF,sizeof(dist)); 48 memset(vis,false,sizeof(vis)); 49 memset(pre,-1,sizeof(pre)); 50 dist[s]=0; 51 vis[s]=true; 52 que.push(s); 53 54 while (!que.empty()) { 55 int u=que.front(); que.pop(); 56 vis[u]=false; 57 for (int i=head[u];i!=-1;i=E[i].nex) { 58 int v=E[i].to; 59 if (dist[v]>dist[u]+E[i].cost && E[i].cap>E[i].flow){ 60 dist[v]=dist[u]+E[i].cost; 61 pre[v]=i; 62 if (!vis[v]) { 63 que.push(v); 64 vis[v]=true; 65 } 66 } 67 } 68 } 69 70 return pre[t]!=-1; 71 } 72 73 void MCMF(int s,int t,int &cost,int &flow) { 74 flow=0; 75 cost=0; 76 while (SPFA(s,t)) { 77 int Min=INF; 78 for (int i=pre[t];i!=-1;i=pre[E[i^1].to]){ 79 Min=min(Min,E[i].cap-E[i].flow); 80 } 81 for (int i=pre[t];i!=-1;i=pre[E[i^1].to]){ 82 E[i].flow+=Min; 83 E[i^1].flow-=Min; 84 cost+=E[i].cost*Min; 85 } 86 flow+=Min; 87 } 88 } 89 90 void work(){ 91 init(); 92 93 int n,m,k,w; 94 scanf("%d%d%d%d",&n,&m,&k,&w); 95 96 for (int i=1;i<=n;i++) { 97 if (i<n) { 98 addedge(i,i+1,INF,0); 99 addedge(3*n+i,3*n+i+1,INF,0); 100 } 101 addedge(n+i,i,INF,w); 102 addedge(n+i,3*n+i,INF,0); 103 addedge(2*n+i,i,INF,0); 104 addedge(2*n+i,3*n+i,INF,w); 105 } 106 107 for (int i=1;i<=m;i++) { 108 int s,t,op; 109 scanf("%d%d%d%d",&s,&t,&w,&op); 110 if (op==0) addedge(s,n+t,1,-w); 111 else addedge(3*n+s,2*n+t,1,-w); 112 } 113 114 int s=0,ss=maxN-2,t=maxN-1; 115 addedge(s,ss,k,0); 116 addedge(ss,1,INF,0); 117 addedge(ss,3*n+1,INF,0); 118 addedge(n,t,INF,0); 119 addedge(4*n,t,INF,0); 120 121 int cost,flow; 122 MCMF(s,t,cost,flow); 123 124 printf("%d\n",-cost); 125 } 126 127 int main(){ 128 int T; 129 scanf("%d",&T); 130 while (T--) work(); 131 return 0; 132 }