摘要:
思路: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); 阅读全文
摘要:
思路:想用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 阅读全文
摘要:
思路:不管是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<= 阅读全文
摘要:
思路:找出所有 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+... 阅读全文
摘要:
思路:定义一个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 阅读全文
摘要:
思路:这题的思路很容易想到,把所有时间点离散化,然后按时间一步一步来,当到达时间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... 阅读全文
摘要:
思路:就是一个很普通的二维树状数组,注意的是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... 阅读全文