bzoj 2058+2059+2060 Usaco2010 Nov

三道金组比较容易的题目。。

2058

首先交换次数就是逆序对数,因为只能交换相邻的两数

先对原序列找逆序对数

用树状数组nlogn求出

然后O(n)依次求出其循环序列的逆序对数

比如 3 5 4 2 1

循环之后相对应的位置变成

2 4 3 1 5

表示第一个数到位置2,第二个数到位置4,第三个数到位置1 etc.

那么依次减一的那些数的逆序对数是不变的。只有1变成5的那个增加或减少了逆序对数

由于5是序列里最大的数,设其所在位置为i,因此增加了n-i对,减少了i-1对

这样总复杂度就是nlogn的

记得开Long long

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #define LL long long
 5 using namespace std;
 6 struct node{
 7     int v,id;
 8 }a[100010];
 9 LL tot,ans,p[100010];
10 int n;
11
12 bool cmp(node a, node b){
13     return a.v<b.v;
14 }
15
16 void add(int x){
17     while (x<=n){
18         p[x]++;
19         x+=x&-x;
20     }
21 }
22
23 LL sum(int x){
24     LL ret=0;
25     while (x){
26         ret+=p[x];
27         x-=x&-x;
28     }return ret;
29 }
30
31 int main(){
32     scanf("%d", &n);
33     for (int i=1; i<=n; i++) scanf("%d", &a[i].v), a[i].id=i,p[i]=0;
34     tot=0;
35     for (int i=1; i<=n; i++){
36         add(a[i].v);
37         tot+=(LL)i-sum(a[i].v);
38     }
39     sort(a+1,a+1+n,cmp);
40     ans=tot;
41     for (int i=1; i<=n; i++){
42         int del=n-a[i].id-(a[i].id-1);
43         tot+=(LL)del;
44         ans=min(ans,tot);
45     }
46     printf("%lld\n", ans);
47     return 0;
48 }

2059

单调队列DP,降复杂度为O(NK)

分n阶段进行单调队列的优化dp

设dis=a[i].x-a[i-1].x

f[i][k]=cost[i]*k+min{f[i-1][j]-cost[i]*j+dis*j*j};

显然f[i][k]只与f[i-1][k]有关所以省略一维,并且先插入队列(此时为f[i-1][k]的值),然后再更新为f[i][k]

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #define LL long long
 5 using namespace std;
 6 const int maxn = 800010;
 7 struct node{
 8     int x,f;
 9     LL c;
10 }a[maxn];
11 struct que{
12     int v;
13     LL val;
14 }q[maxn*2];
15 int K,end,n;
16 LL f[maxn];
17
18 bool cmp(node a, node b){
19     return a.x<b.x;
20 }
21
22 int main(){
23     scanf("%d%d%d", &K, &end, &n);
24     for (int i=1; i<=n; i++) scanf("%d%d%lld", &a[i].x, &a[i].f, &a[i].c);
25     sort(a+1,a+1+n,cmp);
26     memset(f,0x3f3f3f3f,sizeof(f));
27     f[0]=0;
28     for (int i=1; i<=n; i++){
29         int head=0, tail=0;
30         LL dis=a[i].x-a[i-1].x;
31         q[tail].v=0,q[tail].val=0,tail++;
32         for (int j=1; j<=K; j++){
33             LL now=f[j]-(LL)j*a[i].c+dis*(LL)j*(LL)j;
34             while (head<tail && q[tail-1].val>=now) tail--;
35             q[tail].v=j, q[tail].val=now, tail++;
36             while (head<tail && q[head].v+a[i].f<j) head++;
37             f[j]=q[head].val+(LL)j*a[i].c;
38         }
39     }
40     printf("%lld\n", f[K]+(LL)K*(LL)K*(LL)(end-a[n].x));
41     return 0;
42 }

2060

树形dp的入门水题。。

f[u]表示选u的最大值

g[u]表示不选u的最大值

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn = 100010;
 6 struct node{
 7     int to,next;
 8 }e[maxn];
 9 int g[maxn],f[maxn],n,head[maxn],tot,u,v;
10
11 void insert(int u, int v){
12     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
13 }
14
15 void dfs(int x, int fa){
16     g[x]=0; f[x]=1;
17     for (int i=head[x]; i!=-1; i=e[i].next){
18         int v=e[i].to;
19         if (v==fa) continue;
20         dfs(v,x);
21         g[x]+=max(g[v],f[v]);
22         f[x]+=g[v];
23     }
24 }
25
26 int main(){
27     scanf("%d", &n);
28     tot=1; memset(head,-1,sizeof(head));
29     for (int i=1; i<n; i++){
30         scanf("%d%d", &u, &v);
31         insert(u,v); insert(v,u);
32     }
33     dfs(1,0);
34     printf("%d\n", max(g[1],f[1]));
35     return 0;
36 }
时间: 2025-01-01 08:32:57

bzoj 2058+2059+2060 Usaco2010 Nov的相关文章

BZOJ 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛( dp )

树形dp..水 ------------------------------------------------------------------------ #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n ; i++ ) #define clr( x , c )

2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛

2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 252  Solved: 185[Submit][Status] Description 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<=N<=50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统,里面有N-1条路,每条路连接了一对编号为C1和C2的奶牛

【BZOJ 2060】 [Usaco2010 Nov]Visiting Cows 拜访奶牛

2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 257 Solved: 190 [Submit][Status][Discuss] Description 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<=N<=50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统,里面有N-1条路,每条路连接了一对编号

bzoj2060[Usaco2010 Nov]Visiting Cows 拜访奶牛*

bzoj2060[Usaco2010 Nov]Visiting Cows 拜访奶牛 题意: 给棵树,要求如果取了某个节点就不能取与它相邻的节点,问最多可取几个节点.树的大小≤50000. 题解: 树形dp.令f[i][0]不取i节点,f[i][1]为取i节点,则方程为f[i][0]=sum(max(f[j][0],f[j][1]+1)),f[i][1]=sum(f[j][0]),j为i的子节点.最后答案为max(f[1][0],f[1][1]+1).注意不要漏了那个“+1”. 代码: 1 #in

[codevs1380]没有上司的舞会([BZOJ2060][Usaco2010 Nov]Visiting Cows 拜访奶牛)

[codevs1380]没有上司的舞会 试题描述 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会,要求与会职员的快乐指数最大.但是,没有职员愿和直接上司一起与会. 输入 第一行一个整数N.(1<=N<=6000)接下来N行,第i+1行表示i号职员的快乐指数Ri.(-128<=Ri<=127)接下来N-1行,每行输入一对整数L,K.表示K是L的直接上司.最后一行输入

bzoj 1705;poj 3612:[Usaco2007 Nov]Telephone Wire 架设电话线

Description 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务 于是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线. 新的电话线架设在已有的N(2 <= N <= 100,000)根电话线杆上, 第i根电话线杆的高度为height_i米(1 <= height_i <= 100). 电话线总是从一根电话线杆的顶端被引到相邻的那根的顶端 如果这两根电话线杆的高度不同,那么FJ就必须为此支付 C*电话线杆高度差(1 <= C <=

bzoj usaco 金组水题题解(1)

UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT.............. —————————————————————————————————————————————————————————————————————————————— 写(被虐)了整整一个月b站上usaco的金组题...然而到现在总共只写了100道上下TAT(当然是按AC人数降序排

10月刷题总结

(写的题真少QAQ 动态规划: [vijos]1286 座位安排(状压dp) [BZOJ]1026: [SCOI2009]windy数(数位dp) [BZOJ]1596: [Usaco2008 Jan]电话网络(树形dp+特殊的技巧) [BZOJ]1827: [Usaco2010 Mar]gather 奶牛大集会(树形dp) [BZOJ]2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛(树形dp) 计数: [vijos]1789 String(组合计数+奇怪的题)

微软原版SQLHelper类

C# Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84