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. Linux 服务器如何设置文件和文件夹的读写权限

    修改文件可读写属性的方法 例如:把index.htm 文件修改为可写可读可执行: chmod 777 index.htm 要修改目录下所有文件属性可写可读可执行: chmod 777 *.* 该命令中 ...

  2. Discuz X3.2 分区 gid 完美伪静态方法 Apache/Nginx

    Discuz 官方给出的伪静态规则并不完整,只实现了部分的伪静态设置及规则,分区 gid 仍然是 forum.php?gid=xxx 的形式,对于有强迫症的我是无法忍受的,下面给出分区 gid 的伪静 ...

  3. redis 配置文件解读

    # Redis 配置文件 # 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写) # # 1k => 1000 bytes # 1kb = ...

  4. php循环创建目录

    代码取自thinkphp中: function mk_dir($dir, $mod = 0777) { if(!is_dir($dir) || mkdir($dir, $mod)) { if(!mk_ ...

  5. 【转】操作ini文件

    一.INI文件的结构: ; 注释 [小节名] 关键字=值 INI文件有多个小节,每个小节又有多个关键字, “=”后面是该关键字的值.  值的类型有三种:字符串.整型数值和布尔值. 其中字符串存贮在IN ...

  6. MongoDB工具简要说明

    [mongodb@hadoop1 bin]$ pwd /usr/local/mongodb/bin [mongodb@hadoop1 bin]$ ls -l total 207696 -rwxr-xr ...

  7. c语言内存分配-malloc

    malloc 原型:(原来返回类型是char) extern void *malloc(unsigned int num_bytes); 头文件: #include <stdlib.h> ...

  8. 小心指针被delete两次

    C++类中,有时候使用到传值调用(对象实体做参数),遇到这种情况,可要小心了!特别是当你所传值的对象生命周期较长,而非临时对象(生命周期段)的时候.来看看下面的情况: #include <ios ...

  9. MIFARE系列6《射频卡与读写器的通讯》

    1. 复位应答(Answer to request) 读写器呼叫磁场内的卡片,卡片对呼叫做出应答.对刚进入磁场得到电复位处于休闲状态的卡片,卡请求(REQA,0x26):对于已进行过读写操作并进入休眠 ...

  10. SQL 集合(笔记)

    ——SQL是关于集合的 oracle是关系型数据,其中的数据表都是有一定规律的数据的一个个集合,所以在使用SQL时,如果能按照集合的思路来进行时会节省很多效率,也鞥让语句更加的清晰明了. 1.四个集合 ...