T1 一道图论神题(god)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK有一张无向图G={V,E},这张无向图有n个点m条边组成。并且这是一张带权图,只有点权。

LYK想把这个图删干净,它的方法是这样的。每次选择一个点,将它删掉,但删这个点是需要代价的。假设与这个点相连的还没被删掉的点是u1,u2,…,uk。LYK将会增加a[u1],a[u2],…,a[uk]的疲劳值。

它想将所有点都删掉,并且删完后自己的疲劳值之和最小。你能帮帮它吗?

输入格式(god.in)

第一行两个数n,m表示一张n个点m条边的图。

第二行n个数ai表示点权。

接下来m行每行三个数u,v,表示有一条连接u,v的边。数据保证任意两个点之间最多一条边相连,并且不存在自环。

输出格式(god.out)

你需要输出这个最小疲劳值是多少。

输入样例

4 3

10 20 30 40

1 4

1 2

2 3

输出样例

40

样例解释

一个合理的方法是先删4号点,此时有10点疲劳值。接下来删3号点,获得20点疲劳值,再删2号点,获得10点疲劳值,最后删1号点,没有疲劳值。总计40点疲劳值。

对于30%的数据n<=10。

对于60%的数据n,m<=1000。

对于100%的数据1<=n,m,ai<=100000

 /*
对于一条边的两个端点,肯定是选权值大最优
然后对于每条边,都采取这种策略就完成了
*/
#include <algorithm>
#include <cstdio> inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int N();
int n,m,val[N];
long long ans; int Presist()
{
freopen("god.in","r",stdin);
freopen("god.out","w",stdout);
read(n),read(m);
for(int i=; i<=n; ++i) read(val[i]);
for(int u,v,i=; i<=m; ++i)
{
read(u),read(v);
ans+=(long long)std::min(val[u],val[v]);
}
printf("%I64d",ans);
return ;
} int Aptal=Presist();
int main(int argc,char**){;}

贪心AC

T2 位运算2(bit)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK拥有一个十进制的数N。它赋予了N一个新的意义:不考虑N的符号,将N每一位都拆开来后再加起来就是N所拥有的价值。例如数字123拥有6的价值,数字999拥有27的价值,数字-233拥有8的价值。

假设数字N的价值是K,LYK想找到一个价值是K+1的数字,当然这个答案实在太多了,LYK想使得这个价值为K+1的数字尽可能大,并且需要保证这个数字小于N。

输入格式(bit.in)

一个整数N。

输出格式(bit.out)

一个数表示答案。你需要输出一个整数,且这个数不包含前导0。

输入样例1

199

输出样例1

-299

输入样例2

1520

输出样例2

1512

对于20%的数据|N|<=10

对于40%的数据|N|<=100

对于60%的数据|N|<=10^9

对于80%的数据|N|<=10^1000

对于100%的数据|N|<=10^100000。

对于负数的情况从后往前找第一个不是9的数++

 #include <cstring>
#include <cstdio> inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
char s[];
int n,num[]; inline void work1()
{
int i,flag=;
for(i=; i<=n; ++i) num[i]=s[i]-'';
for(i=n; i>; --i)
if(num[i]!=)
{
num[i]++;
flag=;
break;
}
printf("-");
if(!flag) printf("");
for(int i=; i<=n; ++i) printf("%d",num[i]);
} int K;
inline void work2()
{
for(int i=; i<=n; ++i) num[i]=s[i]-'',K+=num[i];
if(num[]==&&num[]==&&n==) { printf("%d\n",); return ; }
if(++K<&&n==&&num[]==) { printf("%d\n",K); return ; }
} int Presist()
{
// freopen("bit.in","r",stdin);
// freopen("bit.out","w",stdout);
scanf("%s",s+);n=strlen(s+);
if(s[]=='-') work1();
else work2();
return ;
} int Aptal=Presist();
int main(int argc,char**){;}

考试只做了负数和特殊正数的情况60分

对于正数的情况,

①设当前位置i到最后一位的价值为tot,如果tot<=(n-i)*9+num[i]-1

最优解为1~i-1为原数,i+1~n尽量填最大,num[i]--;

②否则,为绝对数值最小的负数,等价于位数最小的负数,第一位之后填尽量多的9

 #include <cstring>
#include <cstdio> inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int N();
int n,num[N],k[N],K;
char s[N]; inline void work1()
{
int i,flag=;
for(i=; i<=n; ++i) num[i]=s[i]-'';
for(i=n; i>; --i)
if(num[i]!=)
{
num[i]++;
flag=;
break;
}
printf("-");
if(!flag) printf("");
for(int i=; i<=n; ++i) printf("%d",num[i]);
} inline void work2()
{
for(int i=; i<=n; ++i) num[i]=s[i]-'',K+=num[i];
int tot=num[n]+;
for(int i=n-; i>=; --i)
{
tot+=num[i];
if(!num[i]) continue;
if(tot<=num[i]-+(n-i)*)
{
num[i]--;tot-=num[i];
if(num[]) printf("%d",num[]);
for(int j=; j<=i; ++j) printf("%d",num[j]);
for(int j=i+; j<=n; ++j)
if(tot>=) printf(""),tot-=;
else printf("%d",tot),tot=;
return ;
}
}
printf("-"); K++; int len=K/;
if(K%) printf("%d",K%);
for(; len--; ) printf("");
} int Presist()
{
// freopen("bit.in","r",stdin);
// freopen("bit.out","w",stdout);
scanf("%s",s+);n=strlen(s+);
if(s[]=='-') work1();
else work2();
return ;
} int Aptal=Presist();
int main(int argc,char**){;}

AC

T3 逆序对(pair)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK最近在研究逆序对。

这个问题是这样的。

一开始LYK有一个2^n长度的数组ai。

LYK有Q次操作,每次操作都有一个参数k。表示每连续2^k长度作为一个小组。假设n=4,k=2,则a[1],a[2],a[3],a[4]为一个小组,a[5],a[6],a[7],a[8]为一个小组,a[9],a[10],a[11],a[12]为一个小组,a[13],a[14],a[15],a[16]也为一个小组。

然后LYK对于每个小组都翻转,也就是说原数组会变成a[4],a[3],a[2],a[1],a[8],a[7],a[6],a[5],a[12],a[11],a[10],a[9],a[16],a[15],a[14],a[13]。之后它想求出这2^n个数的逆序对是多少。

因此你需要输出对于每次操作,操作完后这2^n个数的逆序对有多少对。

两个数ai,aj被称为逆序对当且仅当i<j且ai>aj。

输入格式(pair.in)

第一行一个数n。

接下来一行2^n个数ai表示一开始的数组。

接下来一行一个数Q,表示操作的次数。

接下来一行Q个数,表示每次操作的参数k。

输出格式(pair.out)

Q行,表示每次操作后的答案。

输入样例

2

2 1 4 3

4

1 2 0 2

输出样例

0

6

6

0

样例解释

第一次操作,{2,1,4,3}->{1,2,3,4}

第二次操作,{1,2,3,4}->{4,3,2,1}

第三次操作,{4,3,2,1}->{4,3,2,1}

第四次操作,{4,3,2,1}->{1,2,3,4}

对于30%的数据n<=10,Q<=10。

对于50%的数据n<=10,Q<=1000。

对于80%的数据n<=10,Q<=200000。

对于100%的数据n<=17,Q<=200000,1<=ai<=2^n。

归并排序求逆序对的时候,用st表维护从第i个位置,长为2^j的区间的逆序对个数

然后求出对应区间的顺序对个数

维护所有长为2^i的区间的逆序对个数rev[i]和顺序对个数seq[i]

统计答案的时候,拆分就是swap(rev,seq)

在这里顺序对个数是用总个数-逆序对个数求的,要注意相等的情况

因为用总个数-逆序对个数=顺序对个数+相等的数对

所以归并过程中,还要预处理从第i个位置,长为2^j的区间的相等数对个数

计算rev,seq时,同时计算same[i],表示所有长为2^i的区间相等的数对个数

求解的时候 先swap(rev,seq),然后rev-=same,再seq=总的-rev

 #include <cstdio>

 #define LL long long
#define swap(a,b) {LL c=a;a=b;b=c;} inline void read(int &x)
{
x=; register char ch=getchar();
for(; ch>''||ch<''; ) ch=getchar();
for(; ch>=''&&ch<=''; ch=getchar()) x=x*+ch-'';
}
const int N(<<);
int n,nn,m,a[N+],log2[N+]; int last[N+],order[N+];
LL st[N+][],euq[N+][];
LL same[N+],seq[N+],rev[N+],sum[N+];
void Merge_sort(int l,int r)
{
if(l==r) return ;
int mid=l+r>>;
Merge_sort(l,mid);
Merge_sort(mid+,r);
int i,j,k,len=log2[r-l+];
for(i=l; i<=r; ++i) last[i]=i;
for(i=r; i>l; --i)
if(a[i]==a[i-]) last[i-]=last[i];
for(i=k=l,j=mid+; i<=mid&&j<=r; )
if(a[i]==a[j]) euq[l][len]+=last[j]-j+,order[k++]=a[i++];
else if(a[i]>a[j]) st[l][len]+=mid-i+,order[k++]=a[j++];
else order[k++]=a[i++];
for(; i<=mid; ) order[k++]=a[i++];
for(; j<=r; ) order[k++]=a[j++];
for(i=l; i<=r; ++i) a[i]=order[i];
} inline void Prepare()
{
for(int i=; i<=nn; ++i) log2[i]=log2[i>>]+;
Merge_sort(,nn);
for(int i=; i<=n; ++i) sum[i]=1ll*(<<i-)*(<<i-);
for(int len=,i=; i<=n; ++i,len<<=)
for(int j=; j<=nn; j+=len)
{
rev[i]+=st[j][i],
same[i]+=euq[j][i],
seq[i]+=sum[i]-st[j][i];
}
} int Presist()
{
// freopen("pair.in","r",stdin);
// freopen("pair.out","w",stdout);
read(n),nn=<<n;
for(int i=; i<=nn; ++i) read(a[i]);
Prepare(),read(m);
for(int k; m--; )
{
read(k);long long ans=;
for(int i=; i<=k; ++i)
{
swap(rev[i],seq[i]);
rev[i]-=same[i];
seq[i]=sum[i]*nn/(<<i)-rev[i];
}
for(int i=; i<=n; ++i) ans+=rev[i];
printf("%I64d\n",ans);
}
return ;
} int Aptal=Presist();
int main(int argc,char**argv){;}

AC

2017-10-02-morning的更多相关文章

  1. phpStudy + JspStudy 2014.10.02 下载

    phpStudy + JspStudy 2014.10.02 下载 目标:让天下没有难配的php环境. phpStudy Linux版&Win版同步上线 支持Apache/Nginx/Teng ...

  2. 九月 26, 2017 10:18:14 上午 com.sun.jersey.server.impl.application.RootResourceUriRules <init> 严重: The ResourceConfig instance does not contain any root resource classes.

    Tomcat启动错误:九月 26, 2017 10:18:14 上午 com.sun.jersey.server.impl.application.RootResourceUriRules <i ...

  3. 2017/10 冲刺NOIP集训记录:暁の水平线に胜利を刻むのです!

    前几次集训都没有记录每天的点滴……感觉缺失了很多反思的机会. 这次就从今天开始吧!不能懈怠,稳步前进! 2017/10/1 今天上午进行了集训的第一次考试…… 但是这次考试似乎是近几次我考得最渣的一次 ...

  4. Adobe Audition CC 2017 (10.0)安装教程

    Adobe Audition CC 2017 (10.0)安装教程 注:下载地址在文章末尾 第一步:首先请将电脑的网络断开,很简单:禁用本地连接或者拔掉网线,这样就可以免除登录Creative Clo ...

  5. Xamarin 2017.10.9更新

     Xamarin 2017.10.9更新 本次更新主要解决了一些bug.Visual Studio 2017升级到15.4获得新功能.Visual Studio 2015需要工具-选项-Xamarin ...

  6. 2017.10.12 Java的计数器的开发

    //我们用一个合成的applet/application来简单显示出一个计数器的结果/** * Created by qichunlin on 2017/10/12. */ /*简单的计数器*/ im ...

  7. 2017.10.10 java中的继承与多态(重载与重写的区别)

    1. 类的继承 继承是面向对象编程技术的主要特征之一,也是实现软件复用的重要手段,使用继承特性子类(subclass) 可以继承父类(superclass)中private方法和属性,继承的目的是使程 ...

  8. 07/29/2013 02:10:02 AM - CMDPHP: Poller[0] Host[6] DS[10] WARNING: Result from SNMP not valid. Partial Result: U

    snmpwalk -c public -v2c  客户端ip地址  自定义的oid  能取到数据,但是服务器端就是图片一片空白 rrdtool fetch 文件名.rrd 查看到的全都是nan cac ...

  9. 2017.10.31 Enginer+position+statement

    一.The basic information Post name Engineering manager Department Engineering Post member A24645 imme ...

  10. 2017.10.23 Java 面向对象深入学习---final 关键字、static关键字、匿名对象等

    今日内容介绍 1.final 关键字 2.static 关键字 3.匿名对象 4.内部类 5.包的声明与访问 6.访问修饰符 7.代码块 第一节课 01(面向对象)final关键字概念.avi 02: ...

随机推荐

  1. java封装的优点

    在面向对象程式设计方法中,封装(英语:Encapsulation)是指一种将抽象性函式接口的实现细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机 ...

  2. Android 使用pl.droidsonroids.gif.GifImageView在安卓中显示动图遇到的问题

    在做一款聊天软件,其中聊天界面需要发送表情,而表情都是动图,在安卓中想要显示动图,就要借助第三方框架,我选的是pl.droidsonroids.gif.GifImageView. 使用方法如下:你在g ...

  3. com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "FileSize"

    请求阿里云的OSS接口图片信息,返回json格式的数据,通过ObjectMapper将json转为Image对象时候报错转换失败 将json转对象的代码: String jsonStr = " ...

  4. iOS---iOS中SQLite的使用

    一.SQLite的使用 采用SQLite数据库来存储数据.SQLite作为一中小型数据库,应用ios中,跟前三种保存方式相比,相对比较复杂一些.还是一步步来吧! 第一步:导入头文件 需要添加SQLit ...

  5. swiper移动端下不能正常轮播的解决方案-----此坑没躺过估计很难找到正确姿势

    <script> var mySwiper = new Swiper('.swiper-container', { direction: 'vertical', //horizontal横 ...

  6. 关于NSCELL

    作为一个初学者,我一直很弄不明白NSCell的子类,比如,NSButtonCell,NSImageCell及其对应的控件之间的关系.今天,在做一个TableView实现的时候,我终于开始有点悟了——好 ...

  7. swift不同地方 命名空间module iOS

    Objective-C没有命名空间,为了避免冲突,Objective-C的类型一般都会加上两到三个字母的前缀,比如Apple保留的NS和UI前缀,各个系统框架的前缀,各个系统框架的前缀SK(Store ...

  8. day25-2 OSI协议和socket抽象层

    目录 OSI协议 物理层 数据链路层 以太网协议 Mac地址 广播地址 网络层 获取对方Mac地址(ARP协议) 传输层 TCP协议 UDP协议 应用层 socket抽象层 OSI协议 互联网的本质就 ...

  9. tensorboard及summary data

    (新手上路,如果有不对的地方,望指正.另外有没有小伙伴一起学习交流啊?)   tensorboard为tensorflow提供了可视化,它的重要性不言而喻.   tensorboard是通过读取eve ...

  10. 19Web服务

    Web服务 Web服务 Micosoft.Net平台架构中的分布式系统主要包括两部分:用ASP.Net技术构建服务器端动态网页,以及Web服务(Web Service或XML Web Service) ...