Tree http://acm.hdu.edu.cn/showproblem.php?pid=5044

树链剖分,区间更新的时候要用on的左++右--的标记方法,要手动扩栈,用c++交,综合以上的条件可过。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#pragma comment(linker, "/STACK:36777216")
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef __int64 LL;
const int M=;
struct G{
struct E{
int v,next;
}e[M<<];
int le,head[M];
void init(){
le=;
mt(head,-);
}
void add(int u,int v){
e[le].v=v;
e[le].next=head[u];
head[u]=le++;
}
}g;
int n,val[M],fa[M],dep[M],num[M],son[M],top[M],sid[M];
void dfs(int u){
num[u]=;
son[u]=;
for(int i=g.head[u];~i;i=g.e[i].next){
int v=g.e[i].v;
if(v!=fa[u]){
fa[v]=u;
dep[v]=dep[u]+;
dfs(v);
if(num[son[u]]<num[v]) son[u]=v;
num[u]+=num[v];
}
}
}
void get(int u,int Top){
sid[u]=++n;
top[u]=Top;
if(son[u]) get(son[u],top[u]);
for(int i=g.head[u];~i;i=g.e[i].next){
int v=g.e[i].v;
if(v!=fa[u]&&v!=son[u]){
get(v,v);
}
}
}
LL lazy[M],ans[M];
void query(){
LL now=;
for(int i=;i<=n;i++){
now+=lazy[i];
ans[i]=now;
}
}
void update(int x,int y,int z){
lazy[x]+=z;
lazy[y+]-=z;
}
void worknode(int x,int y,int z){
int tx=top[x],ty=top[y];
while(tx!=ty){
if(dep[tx]<dep[ty]){
swap(tx,ty);
swap(x,y);
}
update(sid[tx],sid[x],z);
x=fa[tx];
tx=top[x];
}
if(dep[x]>dep[y]) swap(x,y);
update(sid[x],sid[y],z);
}
void workedge(int x,int y,int z){
int tx=top[x],ty=top[y];
while(tx!=ty){
if(dep[tx]<dep[ty]){
swap(tx,ty);
swap(x,y);
}
update(sid[tx],sid[x],z);
x=fa[tx];
tx=top[x];
}
if(x==y) return ;
if(dep[x]>dep[y]) swap(x,y);
update(sid[son[x]],sid[y],z);
}
struct IN{
int type,u,v,w;
}in[M];
struct EDGE{
int u,v;
}edge[M];
int main(){
int t,N,m,u,v;
while(~scanf("%d",&t)){
int cas=;
while(t--){
scanf("%d%d",&N,&m);
g.init();
for(int i=;i<N-;i++){
scanf("%d%d",&u,&v);
g.add(u,v);
g.add(v,u);
edge[i].u=u;
edge[i].v=v;
}
n=fa[]=dep[]=num[]=;
dfs();
get(,);
char op[];
for(int i=;i<m;i++){
scanf("%s%d%d%d",op,&in[i].u,&in[i].v,&in[i].w);
if(op[]=='') in[i].type=;
else in[i].type=;
}
mt(lazy,);
for(int i=;i<m;i++){
if(in[i].type&) worknode(in[i].u,in[i].v,in[i].w);
}
printf("Case #%d:\n",cas++);
query();
for(int i=;i<=N;i++){
if(i>) printf(" ");
printf("%I64d",ans[sid[i]]);
}
puts("");
mt(lazy,);
for(int i=;i<m;i++){
if(in[i].type==) workedge(in[i].u,in[i].v,in[i].w);
}
query();
for(int i=;i<N-;i++){
int u=edge[i].u;
int v=edge[i].v;
if(dep[u]<dep[v]){
swap(u,v);
}
if(i) printf(" ");
printf("%I64d",ans[sid[u]]);
}
puts("");
}
}
return ;
}

Contest http://acm.hdu.edu.cn/showproblem.php?pid=5045

根据题目要求,任意时刻都不能出现两个人做题数量的差大于1,也就是差要<=1,也就是m个问题要分成长度为n的等长的几块,每块里面一人做一个。

问题转化为n个人n题目,如何选一种排列来获得最大价值,若暴力枚举,复杂度是10!,所以用状态压缩,降为2^10,从000推到111.

转移时看哪个人没做过题,那么就可以让他做,状态就是他这位变为1,值就是当前状态的值加上这个人做当前的题目可获得的价值,当前的题目正好等于已做过题的人的个数+1.

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define mt(a,b) memset(a,b,sizeof(a))
using namespace std;
double a[][],dp[<<];
int one(int x){
int res=;
while(x){
if(x&) res++;
x>>=;
}
return res;
}
int main(){
int t,n,m;
while(~scanf("%d",&t)){
int cas=;
while(t--){
scanf("%d%d",&n,&m);
for(int i=;i<n;i++){
for(int j=;j<m;j++){
scanf("%lf",&a[i][j]);
}
}
int s=,num,all=<<n;
bool flag=true;
double ans=;
while(flag){
flag=false;
if(s+n<m){
flag=true;
num=n;
}
else{
num=m-s;
}
mt(dp,);
for(int i=;i<all;i++){
int yi=one(i);
if(yi>=num) continue;
for(int j=;j<n;j++){
if((i>>j)&) continue;
int next=i|(<<j);
dp[next]=max(dp[next],dp[i]+a[j][s+yi]);
}
}
double big=;
if(num==n){
big=dp[all-];
}
else{
for(int i=;i<all;i++){
if(one(i)==num){
big=max(big,dp[i]);
}
}
}
ans+=big;
s+=n;
}
printf("Case #%d: %.5f\n",cas++,ans);
}
}
return ;
}

Sawtooth http://acm.hdu.edu.cn/showproblem.php?pid=5047

根据另一个类似的题目可以猜想出,这种分割方法出来的平面个数应该是个一元二次函数,a*x^2+b*x+c,过3个点,0的时候是1个平面,题目还输入两组,三个进去解出方程的abc,然后输入x就可以输出值了。

 #include<cstdio>
#include<cstring>
#define mt(a,b) memset(a,b,sizeof(a))
const int M=;
class Hp { //高精度类
int len,s[M];
public:
void init(char ch[]) {
len=;
mt(s,);
int i=;
while(ch[i]==''&&ch[i]!=) i++;
if(ch[i]!=) {
len=strlen(ch)-i;
for(i=; i<len; i++) {
s[i]=ch[len-i-]-;
}
}
}
void print() { //输出
int i=len-;
while(s[i]==&&i>) i--;
for(; i>=; i--) {
printf("%d",s[i]);
}
}
void add(int x) { //高精度加单精度
int temp=;
s[]+=x;
while(s[temp]>) {
s[temp]-=;
temp++;
s[temp]++;
}
if(s[len]!=) len++;
}
void subtract(Hp a) { //高精度减高精度
for(int i=; i<len; i++) {
s[i]-=a.s[i];
if(s[i]<) {
s[i]+=;
s[i+]--;
}
}
while(len>&&s[len-]==) len--;
}
void multiply(int b) { //高精度乘单精度
int temp=;
for(int i=; i<len; i++) {
temp+=s[i]*b;
s[i]=temp%;
temp/=;
}
s[len++]=temp;
while(s[len-]>) {
s[len]+=s[len-]/;
s[len-]%=;
len++;
}
while(len>&&s[len-]==) len--;
}
void multiply(Hp b) { //高精度乘高精度
Hp c;
mt(c.s,);
for(int i=; i<len; i++) {
for(int j=; j<b.len; j++) {
c.s[i+j]+=s[i]*b.s[j];
c.s[i+j+]+=c.s[i+j]/;
c.s[i+j]%=;
}
}
len=len+b.len;
for(int i=; i<len; i++) {
s[i]=c.s[i];
}
while(len>&&s[len-]==) len--;
}
} A,B;
char a[M];
int main(){
int t;
while(~scanf("%d",&t)){
int cas=;
while(t--){
scanf("%s",a);
A.init(a);
B.init(a);
A.multiply(B);
A.multiply();
B.multiply();
A.subtract(B);
A.add();
printf("Case #%d: ",cas++);
A.print();
puts("");
}
}
return ;
}

那个类似的题目被我找到了

折线分割平面 http://acm.hdu.edu.cn/showproblem.php?pid=2050

一样的解一元二次

 #include<cstdio>
int main(){
int t,n;
while(~scanf("%d",&t)){
while(t--){
scanf("%d",&n);
printf("%d\n",*n*n-n+);
}
}
return ;
}

end

2014 ACM/ICPC Asia Regional Shanghai Online的更多相关文章

  1. HDU 5052 Yaoge’s maximum profit 光秃秃的树链拆分 2014 ACM/ICPC Asia Regional Shanghai Online

    意甲冠军: 特定n小点的树权. 以下n每一行给出了正确的一点点来表达一个销售点每只鸡价格的格 以下n-1行给出了树的侧 以下Q操作 Q行 u, v, val 从u走v,程中能够买一个鸡腿,然后到后面卖 ...

  2. hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)

    Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  3. HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP

    Clone Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Submiss ...

  4. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  5. 2014 ACM/ICPC Asia Regional Guangzhou Online

    Wang Xifeng's Little Plot http://acm.hdu.edu.cn/showproblem.php?pid=5024 预处理出每个点八个方向能走的最远距离,然后枚举起点,枚 ...

  6. 2014 ACM/ICPC Asia Regional Anshan Online

    默默的签到 Osu! http://acm.hdu.edu.cn/showproblem.php?pid=5003 #include<cstdio> #include<algorit ...

  7. 2014 ACM/ICPC Asia Regional 北京 Online

    G - Grade Ted is a employee of Always Cook Mushroom (ACM). His boss Matt gives him a pack of mushroo ...

  8. 2014 ACM/ICPC Asia Regional Xi'an Online

    03 hdu5009 状态转移方程很好想,dp[i] = min(dp[j]+o[j~i]^2,dp[i]) ,o[j~i]表示从j到i颜色的种数. 普通的O(n*n)是会超时的,可以想到o[]最大为 ...

  9. HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)

    思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’   'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示. 接下去每次就 ...

随机推荐

  1. 定时重启Apache与MySQL方法

    可以定时重启apache服务器等.让网站运行的效果更快. 采用at命令添加计划任务. 有关使用语法可以到window->“开始”->运行“cmd”->执行命令“at /”,这样界面中 ...

  2. js 月历 时间函数 月份第一天 星期的判断

    返回值为0-6,其中返回值0为星期天:如同,php中的日期函数一样判断.

  3. C语言警告:warning C4018: “<”: 有符号/无符号不匹配

    问题如下: 代码出问题之处:   原因分析: strlen返回一个无符号整型,也就是unsigned型,比较时应该两边的数据类型相同,故严格上来说,应该将m定义为unsigned型.       修改 ...

  4. linux之I2C裸机驱动解析(转)

    1      硬件特性 1.1 概述 I2C总线是由Philips公司开发的两线式串行总线,这两根线为时钟线(SCL)和双向数据线(SDA).由于I2C总线仅需要两根线,因此在电路板上占用的空间更少, ...

  5. 008-python基础-数据类型

    一.基本数据类型: 数字 int 字符串 str 布尔值 bool      真或假 1或0 列表 list 元组 tuple    (不可变列表) 字典 dict       (无序)

  6. Supporting Connected Routes to Subnet Zero

    Supporting Connected Routes to Subnet Zero IOS allows the network engineer to tell a router to eithe ...

  7. hdu 5444 Elven Postman

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Description Elves are very peculia ...

  8. Android中使用WebView, WebChromeClient和WebViewClient加载网页

    在android应用中,有时要加载一个网页,如果能配上一个进度条就更好了,而android 中提供了其很好的支持, 其中webView的一系列用法,比如 webView.getSettings().s ...

  9. [转]Linux下的图形库介绍

    [转]Linux 下的图形库介绍 http://blog.csdn.net/gogor/article/details/5925925 在进行Linux下的图形系统编程时,我们常常会遇到以下这些概念: ...

  10. 29.DDR2问题1仿真模型文件

    在使用modelsim仿真DDR2时,一般我们会用美光网站上下载的DDR2仿真模型.仿真模型文件一般有ddr2_module.v,ddr2.v,ddr2_mcp.v,ddr2_parameters.v ...