摘要:
单点更新,区间求最大值的题;可以使用树状数组和线段树;#include#include#include#define maxn 2000009#define ll long longusing namespace std;int m,n=0;ll ma[maxn],d[maxn];void insert(int w,ll x){ d[w]=x; while(w=l) { ret=max(ret,ma[r]); r-=r&-r; } else r--; } return ret;}cha... 阅读全文
摘要:
n个人,m种信仰;问你相邻的人信仰不同的情况有多少种?首先第一个人有m种选择,第二个人有m-1种选择,后面所有的人都只有m-1种选择;所以结果就是m^n-m*(m-1)^(n-1)#include#include#include#define ll long long#define mod 100003using namespace std;ll pow_mod(ll n,ll p){ ll ans=1; while(p) { if(p&1) ans=ans*n%mod; n=n*n%mod; p>>=1; } retur... 阅读全文
摘要:
斜率优化dp;推荐学习http://www.cnblogs.com/perseawe/archive/2012/05/12/bz1010.html看着别人的题解自己学着推,终于理解了#include#include#include#define ll long long#define maxn 50005using namespace std;int q[maxn],head=0,tail=0;ll f[maxn];ll g[maxn],s[maxn];ll dp[maxn];ll get_g(int k,int j,int c){ return dp[k]+(f[k]+c)*(f[k]... 阅读全文
摘要:
刚刚看到题,感觉是最小割最大流;但是数据量很大,看看网上的题解,发现要把它变成最短路来做;每个孔作为一个点,孔之间的边作为点之间的边;然后利用spfa就可以了!不过这个题runtime error了我15发;经大师提醒才知道,在main函数里面不能够开大数组;因为main函数中的变量保存在栈中;代码:#include#include#include#define inf 1e8using namespace std;const int maxn=2*1005*1005;const int maxm=3*maxn;struct edge{ int from,to,dist; edge... 阅读全文
摘要:
这是一个线段树的题目;我记得一个月前在cf上也做过一个类似的题目; 1 #include 2 #include 3 #include 4 #define maxn 100010 5 #define bon 1000010 6 using namespace std; 7 int cover[bon=0)21 {22 cover[rt=0) return cover[rt];30 int mid=(l+r)>>1;31 pushdown(rt);32 if(x=r)39 {40 cover[rt]=i;41 ... 阅读全文
摘要:
dp,用优先队列存,上个节点节点覆盖下来的长度;不过还不是很明白; 1 #include 2 #include 3 #include 4 #define maxn 1005 5 #define inf 999999 6 using namespace std; 7 struct node 8 { 9 int id;10 int v;11 node(int id=0,int v=0):id(id),v(v){}12 bool operatort.v;15 }16 };17 priority_queueq1,q2;18 19 int f[maxn],a[ma... 阅读全文
摘要:
一个简单的搜索;反正树的结构不会变,只需要把节点的名称换一下就行;可惜比赛的时候思路不清晰; 1 #include 2 #define maxn 5050 3 #include 4 #include 5 #include 6 using namespace std; 7 int age[maxn]; 8 int biao[maxn]; 9 bool vis[maxn];10 vectorve[maxn],pa[maxn];11 char s[10];12 int ans;13 void dfs(int x,int v)14 {15 vis[x]=1;16 pa[v].push_... 阅读全文
摘要:
最长公共上升子序列:O(n*m)的算法; 1 #include 2 #include 3 #define maxn 1000 4 using namespace std; 5 int a[maxn],b[maxn],f[maxn]; 6 int main() 7 { 8 int t,n,m; 9 scanf("%d",&t);10 while(t--)11 {12 memset(f,0,sizeof f);13 int ans=0;14 scanf("%d",&n);15 for(int i=0;i... 阅读全文
摘要:
初识后缀自动机;推荐学习:http://blog.sina.com.cn/s/blog_7812e98601012dfv.html 1 #include 2 #include 3 #include 4 #define maxn 600009 5 using namespace std; 6 7 char s[maxn]; 8 9 struct node10 {11 int l;12 node *ch[28],*fail;13 } pool[maxn],*head,*tail;14 int top;15 void add(int x)16 {17 node *p=&p... 阅读全文
摘要:
利用单调性求最短连续子序列的和大于等于s; 1 #include 2 #include 3 #include 4 #define maxn 100009 5 using namespace std; 6 7 int sum[maxn]; 8 int main() 9 {10 int n,s,x;11 while(scanf("%d%d",&n,&s)!=EOF)12 {13 memset(sum,0,sizeof sum);14 int ans=n+1;15 for(int i=1;isum[i]-s)continue;... 阅读全文