上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 22 下一页
摘要: 思路:将查询区间按右节点的升序排列,然后插入第i个数的时候,若nun[i]+1已经插入,那么就update(pre[num[i]+1],-1);pre[]表示的是该数的位置。同样若num[i]-1存在就update(pre[num[i]-1],-1);因为他么与num[i]属于一组,故只需一个存在就行。当查询的右边界r等于i时,只需对其左边界求和就行,Sum(qt[j].l)。#include#include#include#include#define Maxn 100010#define lowbit(x) (x&(-x))using namespace std;int C[Max 阅读全文
posted @ 2013-08-02 13:10 fangguo 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 思路:dp[i][j]表示区间(i,j)中回文串的个数,那么dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+1][j-1];如果str[i]==str[j],那么dp[i][j]+=dp[i+1][j-1]+1;#include#include#include#include#define Maxn 1010#define Mod 10007using namespace std;int dp[Maxn][Maxn];int main(){ int t,i,j,n,Case=0; char str[Maxn]; scanf("%d",&t); 阅读全文
posted @ 2013-08-01 21:29 fangguo 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 思路:想用Tarjan算法进行缩点,并记录每个连通分支的点数。缩点完毕过后,找出所有出度或入度为0的连通分量,假设该连通分量的点数为num[i],那么ans=Max(ans,(n-num-1)*(n-num)+(num-1)*num+(n-num)*num-m);#include#include#include#include#define Maxn 100010#define Max(a,b) (a)>(b)?(a):(b)using namespace std;int head[Maxn],vi[Maxn],dfn[Maxn],low[Maxn],e,lab,top,Stack[Ma 阅读全文
posted @ 2013-08-01 20:28 fangguo 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 思路:不管是Alice,还是Bob,每次操作都会影响最右下角的数,那么如果是1,Alice赢,否则Bob赢#include#include#include#include#define Maxn 100010#define lowbit(x) (x&(-x))using namespace std;int main(){ int n,m,i,j,t,a; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) for(j=1;j<= 阅读全文
posted @ 2013-08-01 18:39 fangguo 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 思路:找出所有 a#include#include#include#define Maxn 100010#define lowbit(x) (x&(-x))using namespace std;int C[Maxn],n;int Sum(int pos){ int sum=0; while(pos) { sum+=C[pos]; pos-=lowbit(pos); } return sum;}void update(int pos){ while(pos<=n) { C[pos]++; pos+... 阅读全文
posted @ 2013-08-01 16:42 fangguo 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 思路:定义一个map容器用来记录数ai上次出现的位置。将查询区间按右边界升序进行排序,当插入第i个数ai时,pre[ai]+1---->i的区间就会多一个不同的数,其值就是ai,那么可以用update(pre[ai]+1,ai)来保存,但又不能影响i之后的位置,故用update(i,-ai)来消除。每次对于右边界时i的查询区间,只要对其左边界求和就行了,即Sum(qt[i].l)。#include#include#include#include#include#define Maxn 40010#define lowbit(x) (x&(-x))using namespace s 阅读全文
posted @ 2013-08-01 13:47 fangguo 阅读(156) 评论(0) 推荐(0) 编辑
摘要: 思路:这题的思路很容易想到,把所有时间点离散化,然后按时间一步一步来,当到达时间i的时候处理所有在i处的查询。这个代码怎一个挫字了得#include#include#include#include#include#define Maxn 100010#define lowbit(x) (x&(-x))using namespace std;int C[Maxn*3],n,ans[Maxn];struct Flower{ int l,r;}flower[Maxn];struct Lisan{ int val,type,l; int pos; int operator q... 阅读全文
posted @ 2013-08-01 10:39 fangguo 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 思路:就是一个很普通的二维树状数组,注意的是x1,y1不一定在x2,y2的左下方。#include#include#include#include#define Maxn 1105#define lowbit(x) (x&(-x))using namespace std;int C[Maxn][Maxn],n=1010,LIST[Maxn][Maxn];int Sum(int i,int j){ int sum=0; int y; y=j; while(i) { j=y; while(j) { sum... 阅读全文
posted @ 2013-08-01 08:50 fangguo 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 思路:从一维扩展到三维。可以看看poj2155的解法。#include#include#include#include#define Maxn 102#define lowbit(x) (x&(-x))using namespace std;int C[Maxn][Maxn][Maxn],n;int Sum(int i,int j,int k){ int sum=0; int y,z; y=j,z=k; while(i) { j=y; while(j) { k=z; while(... 阅读全文
posted @ 2013-07-31 21:17 fangguo 阅读(127) 评论(0) 推荐(0) 编辑
摘要: 思路:首先就是状态压缩,然后判断哪些状态是回文串。最后就是动态方程:dp[i]=min(dp[i],dp[j]+1)。这个方程得前提条件是状态(j-i)为回文串。#include#include#include#define inf 1=0;i--) { dp[i]=inf; for(j=i+1;j<=n;j=((j+1)|i)) { if(pl[j-i]) dp[i]=min(dp[i],dp[j]+1); } ... 阅读全文
posted @ 2013-07-31 18:04 fangguo 阅读(257) 评论(0) 推荐(0) 编辑
上一页 1 ··· 10 11 12 13 14 15 16 17 18 ··· 22 下一页