摘要: 思路:这个方法要看《浅谈几类背包问题》这篇论文。#include"stdio.h"#define Max(a,b) (a)>(b)?(a):(b)int f[31],k[8];int main(){ int i,j,m,Case=0; while(scanf("%d%d%d%d%d%d",&k[1],&k[2],&k[3],&k[4],&k[5],&k[6])!=EOF,k[1]|k[2]|k[3]|k[4]|k[5]|k[6]) { for(i=0;i0) { if(k[i]=m*i;j--) .. 阅读全文
posted @ 2013-08-02 20:51 fangguo 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 思路:裸的单调队列。#include#include#include#include#define Maxn 1000010using namespace std;int n,k,que[Maxn],num[Maxn],head,rear;int main(){ int i,j,a; while(scanf("%d%d",&n,&k)!=EOF) { head=1; rear=0; for(i=1;i=head&&num[que[rear]]>=num[i]) rear--; que... 阅读全文
posted @ 2013-08-02 16:21 fangguo 阅读(145) 评论(0) 推荐(0) 编辑
摘要: #include#include#include#include#define Maxn 100010using namespace std;__int64 ans=0;int Stack[Maxn],top;int main(){ int n,i,j,a; while(scanf("%d",&n)!=EOF) { ans=0; top=0; for(i=1;i0&&Stack[top]<=a) top--; ans+=(__int64)top; Stack[+... 阅读全文
posted @ 2013-08-02 15:28 fangguo 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 思路:将查询区间按右节点的升序排列,然后插入第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) 编辑