09 2013 档案
摘要:思路:容易知道加向量的顺序是按向量斜率的大小顺序来的。由于数据不是很大,可以用背包解决!!dp[i][j]:加入最大面积为i时,加入了j个向量。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll long long 9 #define M 5510 #define inf 1e1011 #define mod 100000000712 using namespace std;13 struct point14 {15 int x,y;16 ...
阅读全文
摘要:思路:三维DP,刚开始用记忆化搜索,MLE……后来改为直接预处理所有的情况。总之就是必败态的后继是必胜态!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll long long 9 #define M 30210 #define inf 1e1011 #define mod 100000000712 using namespace std;13 bool dp[M][M][M];14 int main()15 {16 int a,b,c,t;1...
阅读全文
摘要:思路:首先给出几个结论:1.gcd(a,b)是积性函数;2.积性函数的和仍然是积性函数;3.phi(a^b)=a^b-a^(b-1);记 f(n)=∑gcd(i,n),n=p1^e1*p2^e2……;则 f(n)=∑d*phi(n/d) (d是n的约数) =∑(pi*ei+pi-ei)*pi^(ei-1).代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define M 5000510 #define inf 1e1011 #de
阅读全文
摘要:思路:先生成序列再求异或,最多的可能为n*(n+1)/2;在去掉其中必败的序列,也就是a[i]=a[j]之间的序列。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll long long 9 #define M 10000510 #define inf 1e1011 #define mod 100000000712 using namespace std;13 int n,s,w,a[M];14 int main()15 {16 int i,j,t...
阅读全文
摘要:思路:每个数的SG值就是其质因子个数,在进行nim博弈代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll long long 9 #define M 500000510 #define inf 1e1011 #define mod 100000000712 using namespace std;13 int prime[M/3],cnt,sg[M],a[100005];14 bool f[M];15 void init()16 {17 cnt=0...
阅读全文
摘要:思路:P态的所有后继全为H态,第一个格子为P态,第一行和第一列为H态。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll long long 9 #define M 8000410 #define inf 1e1011 #define mod 100000000712 using namespace std;13 int m,n;14 char ans[M];15 int cal(int x,int y)16 {17 return x*m+y;18...
阅读全文
摘要:思路:dp[i][j][k]:满足在字符串的j位,前一位数字是k。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define ll long long 7 #define M 100000000 8 using namespace std; 9 char str[101],a[101],b[101];10 int len,bit[101],dp[101][101][10];11 bool ok(int i,int u,int v)12 {13 if(str[i]=='/') return uv;1
阅读全文
摘要:这个纯粹是一个细节题啊!!!由于某个地方的浮点数比较写错了,WA了无数次啊……代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 char str1[10],str2[10]; 8 double h,s,l,r,g,b,v; 9 bool is(double h,double a,double b) 10 { 11 if(h-a>=-1e-8&&h-b=b) h=60*(g-b)/t; 54 else if(ma-r<1e-8&&g
阅读全文
摘要:比赛的时候,被题目误导了,题目最后说结果可能很大,要取模,那时就想直接求会TLE的!!!赛后才知道,坑啊…………代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define ll long long 7 #define M 80001 8 #define mod 1000000007 9 using namespace std;10 int prime[M/3],cnt,p[M];11 bool f[M];12 void init()13 {14 cnt=0;15 memset(f,0,sizeof...
阅读全文
摘要:思路:状态最多有2^12,采用记忆化搜索!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define inf 1v) swap(u,v);67 for(int i=0;i0?"Tom200":"Jerry404");90 }91 return 0;92 }View Code
阅读全文
摘要:暴力打表!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define M 1000000 7 #define ll __int64 8 using namespace std; 9 int sg[1000000];10 int get_len(int n)11 {12 if(n>=100000) return 6;13 else if(n>=10000) return 5;14 else if(n>=1000) return 4;15 else if(n>=100) return...
阅读全文
摘要:其实规律很好找的,当从某点开始,向某一边找出非0的个数,为奇数时必胜。代码如下: 1 #include 2 #include 3 using namespace std; 4 int n,a[25]; 5 bool dfs(int m) 6 { 7 int cnt=0,i=m,k; 8 while(a[i]) i=(i+1)%n,cnt++; 9 if(cnt&1) return 1;10 i=(m+n-1)%n;cnt=0;11 while(a[i]) i=(n+i-1)%n,cnt++;12 if(cnt&1) return 1;13 ...
阅读全文
摘要:思路:HDU有过类似的题目,也就是谁面对FIB数,就处于必败状态。再求第二问的时候要注意不一定要在一步之内就让对手处于必败状态,可以多步进行,这个过程可以用递归实现。代码如下: 1 #include 2 using namespace std; 3 int fib[44]; 4 int dfs(int n) 5 { 6 int k=0; 7 while(fib[k]>n){18 int k=0;19 while(fib[k]<n) k++;20 if(fib[k]==n) cout<<"lose"<<endl;21 ...
阅读全文
摘要:思路:为了方便,当c1>c2时将0变为1,1变为0.空格最多有10个,每个空格有3个状态,如果不状态压缩,会TLE的。所以最多有3^10种情况代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #define inf 1mm; 21 bool vis[9][9]; 22 void dfs(int x,int y) 23 { 24 if(vis[x][y]) return ; 25 vis[x][y]=1; 26 s...
阅读全文
摘要:思路:用极大极小搜索解决这样的问题很方便!!代码如下: 1 #include 2 #include 3 #define inf 100000000 4 using namespace std; 5 char str[4][5]; 6 int x,y,num; 7 bool ok(int x,int y) //判断是否胜 8 { 9 int i; 10 for(i=0;i=mi) return ma; 46 } 47 return ma; 48 } 49 int minimax(int x,int y,int ma) 50 {...
阅读全文
摘要:思路:总共有18条边,9个三角形。极大极小化搜索+剪枝比较慢,所以用记忆化搜索!!用state存放当前的加边后的状态,并判断是否构成三角形,找出最优解。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define inf 10?"A wins.":"B wins.");75 }76 return 0;77 }View Code
阅读全文
摘要:数位DP!dp[i][j][k]:第i位数,状态为j,长度为k代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 using namespace std;10 ll dp[20][1025][11];11 int bit[20],k;12 int Getlen (int sta)//求出最长上升子序列的长度13 {14 int ret = 0;15 while (sta)16 {17 ret +=...
阅读全文
摘要:思路:分析知道sum(1,i) (1 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 using namespace std;10 int a[200002],p[200002],mp[200002];11 int main()12 {13 int n,cnt;14 while(scanf("%d",&n)&&n){15 for(int i=1;ipre){29 ...
阅读全文
摘要:思路:求最长回文子串的长度!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int s[3001],dp[3001][3001]; 9 int dfs(int p,int q)10 {11 if(dp[p][q]!=-1) return dp[p][q];12 if(p>q) return dp[p][q]=0;13 dp[p][q]=max(dfs(p+1,q),dfs(p,q-1));14 if(s...
阅读全文
摘要:一个简单的搜索题,唉……当时脑子抽了,没做出来啊……代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 struct node10 {11 int x,y;12 }p[30];13 int ans,now,n;14 bool f[30];15 void dfs(int m)16 {17 if(m>=n){18 if(now>ans) ans=now;19 ret...
阅读全文
摘要:直接贴模版!!!求异面直线的距离及坐标!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define I(p) scanf("%lf%lf%lf",&p.x,&p.y,&p.z) 9 #define eps 1e-20 10 #define zero(x) (((x)>0?(x):-(x))eps){239 ret.x+=(u.b.x-u.a.x)*t;240 241 ret.y+=(u.b.y-u.a.y)*t;242
阅读全文
摘要:思路:搜索的时候是从高位到低位,所以一旦遇到非0数字,也就确定了数的长度,这样就知道回文串的中心点。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #define ll long long 8 using namespace std; 9 ll dp[20][20][2];10 int bit[20],num[20];11 ll dfs(int pos,int m,int s,bool f)12 {13 if(!pos) return 1;14 if(!f&&dp[pos][m]
阅读全文
摘要:思路:典型的数位DP!!!dp[i][j][k]:第i位,对mod取余为j,数字和对mod取余为k。注意:由于32位数字和小于95,所以当k>=95时,结果肯定为0.这样数组就可以开小点,不会超内存!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int dp[11][95][95],bit[11],k; 9 int dfs(int pos,int m,int s,bool f)10 {11 if(pos==-1) return !m&
阅读全文
摘要:思路:dp[i][j]:表示第i位数,j表示是否有0.代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll long long 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 int bit[22];13 ll dp[22][2],p[22];14 ll dfs(int pos,int m,bool f)15 {16 if(pos==-1) return !m;...
阅读全文
摘要:思路:dp[i][j]:表示第i位在B进制下数字和。用二分找第k个数!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 using namespace std;10 int dp[45][310],b,m,bit[45];11 int dfs(int pos,int mm,bool f)12 {13 if(pos==-1) return mm==m;14 if(!f&&dp[pos][mm]!=-1) return d
阅读全文
摘要:思路:首先用Tarjan算法找出树中的环,环为奇数变为边,为偶数变为点。之后用博弈论的知识:某点的SG值等于子节点+1后的异或和。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int ans; 9 vectorp[105];10 bool vis[105],inss[105];11 int low[105],dfa[105],num[105][105],ss[105],top;12 void Tarjan(int u,int pre,int d)1
阅读全文
摘要:思路:无向图,走过的点不能在走。dfs搞定……再就是后继中有必败点的为必胜点!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int ans; 9 vectorp[1001];10 bool vis[1001];11 int dfs(int n)12 {13 for(int i=0;i<p[n].size();i++){14 if(!vis[p[n][i]]){15 vis[p[n][i]]=1;16 ...
阅读全文
摘要:思路:每次画X之后都会形成2个子游戏,即i-3和n-i-2.代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 int sg[2002]; 9 int getsg(int n)10 {11 if(n=0) return sg[n];13 bool vis[2002]={0};14 for(int i=1;i<=n;i++){15 vis[getsg(n-i-2)^getsg(i-3)]=1;16 }17 ...
阅读全文
摘要:思路:dp[i][j]:第i个人时还剩j个石头。当j为0时,有必胜为1;后继中有必败态的为必胜态!!记忆化搜索下就可以了!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #define inf 1e9 8 using namespace std; 9 int dp[22][10000],n,a[22];10 int dfs(int d,int s)11 {12 if(dp[d][s]!=-1) return dp[d][s];13 if(s==0) return dp[d][s]...
阅读全文
摘要:思路:这题和博弈论的关系不大,主要是DP。记忆化搜索即可!!!取的数一定是大于0的,所以将负数去掉!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #define inf 1e9 8 using namespace std; 9 int dp[10005],n,a[10005],l,r;10 int dfs(int m)11 {12 if(dp[m]!=inf) return dp[m];13 int ans=inf;14 for(int i=m+1;i=l&&a[i]...
阅读全文
摘要:思路:SG函数应用!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int sg[1001],n; 8 vectorp[1001]; 9 int dfs(int now)10 {11 if(sg[now]!=-1) return sg[now];12 bool vis[1001]={0};13 for(int i=0;i<p[now].size();i++)14 vis[dfs(p[now][i])]=1;15 int i...
阅读全文
摘要:思路:求SG函数!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 int sg[202][202]; 7 int getsg(int m,int n) 8 { 9 if(sg[m][n]!=-1) return sg[m][n];10 bool vis[200];11 memset(vis,0,sizeof(vis));12 for(int i=2;i>m>>n) puts(getsg(m,n)?"WIN":"LOSE");23 re
阅读全文
摘要:令ans=a1^a2^...^an,如果需要构造出异或值为0的数,而且由于只能操作一堆石子,所以对于某堆石子ai,现在对于ans^ai,就是除了ai以外其他的石子的异或值,如果ans^ai#include#includeusing namespace std;int a[1001];int main(){ int n,t,ans,m,k; while(cin>>n&&n){ ans=m=0; for(int i=0;i>a[i]; m^=a[i]; } if(m){ for(int ...
阅读全文
摘要:思路:刚开始想复杂了。看解题报告后才知道这题挺简单的,看来还是要多训练啊!!!单独处理首位的数字,不能为0.其他的就好处理了,从大到小依次找下去就可以了……代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 100000511 using namespace std;12 char a[MAX],b[MAX];13 int c[11],d[11];14 int fi
阅读全文
摘要:思路:容易知道,分解成素数的lcm肯定是最大的,因为假设分解成2个合数,设定x为他们的 最大公约数,那么他们的最小公倍数就要减少x倍了 然后如果是素数之间的最小公倍数,那么就只是他们的乘积,同样的n分解,没有 除的肯定比有除的大,因此可以得到结论 所以可以先晒一次素数,然后用这些素数填满那个n 这里填满也很容易想到是背包问题了,因为同一个素数可以用几次,所以就是一个 典型的多重背包了,就是dp[j] = lcm(dp[j - k] , dp[k]); 然后还有一个问题,就是对于所有素数取lcm,会导致结果很大,超int的 而且虽然有取mod,那么转移方程变为dp[j] = dp[j - k]
阅读全文
摘要:数位DP!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 ll dp[22][15][200];13 int bit[22];14 ll dfs(int pos,int mod,int sum,bool f)15 {16 if(pos==-1) return mod==0;17 i...
阅读全文
摘要:思路:实际上求的是和小于等于n的质数的种类数!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 int prime[1105],cnt;13 ll dp[1105][1100];14 bool f[1005];15 void init()16 {17 cnt=0;18 for(int...
阅读全文
摘要:思路:每次枚举数字和也就是取模的f(x),这样方便计算。其他就是基本的数位Dp了。代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 int bit[10],dp[10][90][90][90];13 int dfs(int pos,int num,int mod,int sum,bool f)14 {1
阅读全文
摘要:1003 Rotation Lock Puzzle找出每一圈中的最大值即可代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define pi acos(-1.0)10 #define MAX 5000011 using namespace std;12 ll a[10][10],b[10];13 vectorq;14 int main(){15 int i,j,k,m,n;16 while(scanf("%d"
阅读全文
摘要:数位DP,注意状态DP的转移代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define ll __int64 9 #define mod 100000000710 using namespace std;11 struct node12 {13 ll n,sum,pow;14 node():n(0),sum(0),pow(0){}15 }dp[20][7][7];16 int bit[20];17 ll p1[20];18 node dfs(int po...
阅读全文
摘要:思路:dp[i][j][k]:表示以j为支点时两边和为k的个数注意去掉0,00,000……等。代码如下: 1 #include 2 #include 3 #include 4 #define ll __int64 5 using namespace std; 6 int bit[20]; 7 ll dp[20][20][2000]; 8 ll dfs(int pos,int pre,int o,bool f) 9 {10 if(pos==-1) return pre==0;11 if(!f&&dp[pos][o][pre]!=-1) return dp[pos][o][pre]
阅读全文
摘要:思路:数位DP 1 #include 2 #include 3 int bit[10],dp[10][10][13][2]; 4 int dfs(int pos,int pre,int mod,bool h,bool inf) 5 { 6 if(pos==-1) return h&&!mod; 7 if(!inf&&dp[pos][pre][mod][h]!=-1) return dp[pos][pre][mod][h]; 8 int i,ans=0; 9 int e=inf?bit[pos]:9;10 for(i=0;i<=e;i++){11 ...
阅读全文
摘要:主要注意下0的情况就可以!!!链接:http://acm.uestc.edu.cn/problem.php?pid=1307代码如下: 1 #include 2 #include 3 #include 4 #define ll __int64 5 using namespace std; 6 int bit[10],dp[20][20]; 7 int dfs(int pos,int pre,bool h,bool f) 8 { 9 if(pos==-1) return h==0;10 if(!f&&dp[pos][pre]!=-1&&!h) return dp[
阅读全文
摘要:思路:dp[i][0]:没有49出现的个数dp[i][1]:出现只4的个数dp[i][2]:出现49的个数代码如下: 1 #include 2 #include 3 #include 4 #define ll __int64 5 using namespace std; 6 int bit[20]; 7 ll dp[20][3]; 8 ll dfs(int pos,int h,bool f) 9 {10 if(pos==-1) return h==2;11 if(!f&&dp[pos][h]!=-1) return dp[pos][h];12 ll ans=0;13 ...
阅读全文
摘要:思路:要找一个数能被他的所有反的数字整除,只需求出这个数能被其数字的LCM整除。而LCM最大为5*7*8*9=2520;如果直接开dp[20][2520][2520]会超内存,而2^3,3^2,5,7的组合只有4*3*2*2=48种,所以开dp[20][2520][50]即可。链接:http://codeforces.com/problemset/problem/55/D代码如下: 1 #include 2 #include 3 #include 4 #define ll __int64 5 using namespace std; 6 int bit[20],hash[2529]; 7 ll
阅读全文
摘要:思路:dp[i][0]:位数 2 #include 3 int bit[6],dp[6][3]; 4 int dfs(int pos,int h,bool f) 5 { 6 if(pos==-1) return 1; 7 if(!f&&dp[pos][h]!=-1) return dp[pos][h]; 8 int ans=0; 9 int e=f?bit[pos]:9;10 for(int i=0;i<=e;i++){11 if(i==4||(h==1&&i==2)) continue;12 ans+=dfs(pos-1...
阅读全文
摘要:思路:构造矩阵,矩阵快速幂!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define ll __int64 7 #define mod 1000000007 8 using namespace std; 9 int let[100];10 struct ma11 {12 ll a[60][60];13 }A,B;14 ll sum(ma a)15 {16 ll ans=0;17 for(int i=0;i>=1;55 a=mul(a,a);56 }57 ...
阅读全文
摘要:思路:在贾志豪神牛的论文 里,这两种游戏都有其中树的删边游戏:叶子节点的SG值为0;中间节点的SG值为它的所有子节点的SG值加1 后的异或和。ANTI-SG:先手必胜当且仅当:(1)游戏的SG函数不为0且游戏中某个单一游戏的SG函数大于1;(2)游戏的SG函数为0且游戏中没有单一游戏的SG函数大于1。代码如下: 1 #include 2 #include 3 using namespace std; 4 vectorp[102]; 5 int ans,n; 6 int dfs(int m,int f) 7 { 8 int res=0; 9 for(int i=0;i1) cnt...
阅读全文
摘要:思路:叶子节点的SG值为0;中间节点的SG值为它的所有子节点的SG值加1 后的异或和。详见贾志豪神牛的论文:组合游戏略述 ——浅谈SG游戏的若干拓展及变形代码如下: 1 #include 2 #include 3 using namespace std; 4 vectorp[100002]; 5 int get_sg(int n,int u) 6 { 7 int ans=0; 8 for(int i=0;i<p[n].size();i++){ 9 if(p[n][i]!=u) ans^=(1+get_sg(p[n][i],n));10 }11 r...
阅读全文
摘要:给出序列,在剩下的卡中选择,谁先拿到大于31的输,搜一下就可以了!代码如下: 1 #include 2 #include 3 char str[25]; 4 int a[7],sum; 5 bool dfs(int m) 6 { 7 if(m>=31) return 0; 8 for(int i=1;i=31){32 if(l&1) puts("A");33 else puts("B");34 continue;35 }36 if(dfs(sum)){37 ...
阅读全文
摘要:SG函数应用!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int sg[1002],a[101],n; 8 int get_sg(int m) 9 {10 if(sg[m]!=-1) return sg[m];11 bool vis[10000];12 memset(vis,0,sizeof(vis));13 for(int i=0;i<n&&a[i]<=m;i++)14 for(int j=0;j<=m-a[i]-j...
阅读全文
摘要:SG函数打表,求NIM和!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int sg[51][51]; 8 char str[51]; 9 void init()10 {11 int i,j,a,b,k;12 bool vis[510];13 for(i=0;i<=50;i++){14 sg[i][0]=sg[0][i]=i;15 }16 for(i=1;i<=50;i++)17 for(j=1;j<=...
阅读全文
摘要:主要是求NIM积!!!代码如下:#include#include#include#include#define ll __int64using namespace std;int f[20][20];int nim(int x,int y);int _nim(int x,int y){ if(!x||!y)return 1>i)&1)e*=1>i)&1)ret=nim(ret,3*(1>i)&1) for(int j=0;j>j)&1) ret^=_nim(i,j); return ret;}int main(){ int t,x,y,n
阅读全文
摘要:思路:找每一个数的循环节,注意优化!!每次找一个数的循环节时,记录其路径,下次对应的数就不用再找了……代码如下: 1 #include 2 #include 3 #include 4 #include 5 #define ll __int64 6 using namespace std; 7 int vis[801],to[801],an[801]; 8 stackp; 9 ll gcd(ll a,ll b)10 {11 if(a<b) swap(a,b);12 while(b){13 ll t=a;14 a=b;15 b=t%b...
阅读全文
摘要:很经典的问题,思路转载自http://blog.csdn.net/ACM_cxlove?viewmode=contents题目:这是一个经典问题,有n个海盗,分m块金子,其中他们会按一定的顺序提出自己的分配方案,如果50%以上的人赞成,则方案通过,开始分金子,如果不通过,则把提出方案的扔到海里,下一个人继续。首先我们讲一下海盗分金决策的三个标准:保命,拿更多的金子,杀人,优先级是递减的。同时分为两个状态稳定状态和不稳定状态:如果当n和m的组合使得最先决策的人(编号为n)不会被丢下海, 即游戏会立即结束, 就称这个状态时"稳定的". 反之, 问题会退化为n-1和m的组合, 直
阅读全文
摘要:简单的容斥原理!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #define I(x) scanf("%d",&x) 6 #define ll __int64 7 #define MAX 500000 8 using namespace std; 9 int prime[MAX],cnt,e[MAX],num;10 ll a,b,res1,res2;11 bool f[MAX];12 void init()13 {14 cnt=0;15 memset(f,0,sizeof(f));16 for(int i
阅读全文
摘要:线段树!!1A代码如下: 1 #include 2 #include 3 #define lson i>1;26 built(lson,l,m,!f);27 built(rson,m+1,r,!f);28 if(T[i].flag) T[i].res=T[lson].res|T[rson].res;29 else T[i].res=T[lson].res^T[rson].res;30 }31 void update(int i,int d,ll p)32 {33 if(T[i].l==d&&T[i].r==d){34 T[i].res=p...
阅读全文
摘要:线段树+剪枝优化!!!代码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #define ll __int6411 #define pi acos(-1.0)12 #define lson i>1;34 built(lson,l,m);35 built(rson,m+1,r);36 T[i].sum=T[lson].sum+T[rson].sum;37 T[i].flag=T[lson].flag||T...
阅读全文

浙公网安备 33010602011771号