P2345 [USACO04OPEN]MooFest G

原题地址

代码:
突然发现洛谷试炼场换成题单了
具体思路并不难,先按Vi从小到大排序(自己做的时候按X排序了),然后维护两个树状数组,一个维护数量前缀和,一个维护坐标前缀和。
代码来自洛谷题解:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long wz[20010],yy[20010],n,mn=20000;
long long ans;
long long read()
{   long long xx=0;char ch=getchar();while(ch<'0'||ch>'9') ch=getchar();while(ch>='0'&&ch<='9'){xx=xx*10+ch-'0';ch=getchar();}return xx;
}
struct node{long long xi;long long vi;
}a[20010];
bool cmp(node x,node y)
{return x.vi<y.vi;
}
int lobit(int x) {  return x&(-x);}
void crwz(int x) { for(;x<=mn;x+=lobit(x)) wz[x]++;}
int z(int x)//数量前缀和
{int sum=0;for(;x>=1;x-=lobit(x)) sum+=wz[x];return sum;
}
void cryy(int x,int v) { for(;x<=mn;x+=lobit(x)) yy[x]+=v;}
int y(int x)//坐标值前缀和
{int sum=0;for(;x>=1;x-=lobit(x)) sum+=yy[x];return sum;
}
int jdz(int x)//绝对值
{if(x<0) return -x;else return x;
}
int main()
{n=read();for(int i=1;i<=n;++i) a[i].vi=read(),a[i].xi=read();sort(a+1,a+1+n,cmp);//排序for(int i=1;i<=n;++i){int j=a[i].xi;ans+=a[i].vi*(z(j-1)*j-y(j-1)+y(mn)-y(j)-(z(mn)-z(j))*j);crwz(a[i].xi);cryy(j,a[i].xi);}printf("%lld",ans);return 0;
}

gym 100801G.Graph

原题地址

题目大意:给出 n 个点 m 条边的 DAG,要求最多加 k 条有向边(不能形成环),使得可能的字典序最小的拓扑序列最大。输出最终最小的拓扑序列,以及加边数,加的边(1≤n≤1105, 0≤m≤ 1105)

代码:
参考博客
这题主要两个难点,一个是控制加上k条边之后字典序最小的拓扑序列最大,一个是控制不能成环。
参考博客的代码中,maxQ每加如一个元素,k–才执行一次,这样可以控制加边的数目。而每release一个点,才把该点的后继点压入队列,这样可以控制后继点永远不可能有指向该点的边(拓扑序列成环的情况是后继点有一条指向前继点的边)
用操作系统的知识来说,maxQ就是出于阻塞态的进程,minQ就是就绪态的进程,而执行完一个进程后,入度为0的子进程进入就绪态,但可以根据需要把就绪态的进程阻塞。
代码来自参考博客

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define fi first
#define se second
#define dbg(...) cerr<<"["<<#__VA_ARGS__":"<<(__VA_ARGS__)<<"]"<<endl;
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const int inf=0x3fffffff;
const ll mod=1000000007;
const int maxn=1e5+10;
int head[maxn];
struct edge
{int to,next;
}e[maxn*2];   //
int tol=0;
void add(int u,int v)
{e[++tol].to=v,e[tol].next=head[u],head[u]=tol;
}
priority_queue<int,vector<int>,greater<int> >minQ;
priority_queue<int> maxQ;
int d[maxn];
int ans[maxn];
vector<PII> res;
void release(int u)//释放该点的后继点
{for(int i=head[u];i;i=e[i].next){int v=e[i].to;if(--d[v]==0) minQ.push(v);}
}int main()
{freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);int n,m,k;scanf("%d%d%d",&n,&m,&k);rep(i,1,m+1){int u,v;scanf("%d%d",&u,&v);add(u,v);d[v]++;}rep(i,1,n+1) if(!d[i]) minQ.push(i);int len=0;while(len<n){len++;while(k&&minQ.size()>1){k--;int t=minQ.top();minQ.pop();maxQ.push(t);}if(minQ.size()==0)//实在没有可交换的点了,只好把maxQ的队头放出来{int t=maxQ.top();maxQ.pop();ans[len]=t;release(t);res.pb(make_pair(ans[len-1],t));//用ans[len-1]连,可以确保拓扑序列中t在len的位置}else if(minQ.size()==1&&k&&maxQ.size()&&minQ.top()<maxQ.top())//交换{k--;int t=maxQ.top();maxQ.pop();maxQ.push(minQ.top());minQ.pop();ans[len]=t;release(t);res.pb(make_pair(ans[len-1],t));}else//否则就执行minQ{int t=minQ.top();minQ.pop();ans[len]=t;release(t);}}rep(i,1,n+1) printf("%d ",ans[i]);puts("");printf("%d\n",(int)res.size());for(auto it:res)printf("%d %d\n",it.fi,it.se);return 0;
}

Gym - 100513K Treeland

参考博客

根据各点之间的距离关系构造一棵树,很有意思的一道思维题。运用了树上的节点只有一个父节点且可以有多个子节点、父节点距离根的距离比子节点近的特点。

Gym - 100513G

参考博客

算是一道思维题,有意思的地方在于时间复杂度的计算。

POJ 1177扫描线模板题

原题地址
题意很简单,就是求矩形覆盖区的周长。
参考博客
感觉洛谷的最高赞题解已经讲的很详细了,我加一些代码细节的注释
代码来自参考博客

#include <iostream>
#include <stdio.h>
#include <algorithm>
#define lson (x << 1)
#define rson (x << 1 | 1)
using namespace std;
const int MAXN = 2e4;
int n, X[MAXN << 1];
int x1, y1, x2, y2, pre = 0; /* 先初始化为 0 */struct ScanLine {int l, r, h, mark;if(h == rhs.h)return mark > rhs.mark;return h < rhs.h;
//      注意!这里是后来被 hack 掉以后加上去的
//      在此感谢 @leprechaun_kdl 指出问题
//      如果出现了两条高度相同的扫描线,也就是两矩形相邻
//      那么需要先扫底边再扫顶边,否则就会多算这条边
//      这个对面积并无影响但对周长并有影响
//      hack 数据:2 0 0 4 4 0 4 4 8 输出应为:24
} line[MAXN];struct SegTree {int l, r, sum, len, c;
//  c表示区间线段条数
//sum维护的是横线被多少矩形覆盖bool lc, rc;
//  lc, rc分别表示左、右端点是否被覆盖
//  统计线段条数(tree[x].c)会用到
} tree[MAXN << 2];void build_tree(int x, int l, int r) {tree[x].l = l, tree[x].r = r;tree[x].lc = tree[x].rc = false;tree[x].sum = tree[x].len = 0;tree[x].c = 0;if(l == r)return;int mid = (l + r) >> 1;build_tree(lson, l, mid);build_tree(rson, mid + 1, r);
}void pushup(int x) {int l = tree[x].l, r = tree[x].r;if(tree[x].sum) {//sum!=0表示该段被完全覆盖tree[x].len = X[r + 1] - X[l];tree[x].lc = tree[x].rc = true;tree[x].c = 1;
//      做好相应的标记}else {tree[x].len = tree[lson].len + tree[rson].len;tree[x].lc = tree[lson].lc, tree[x].rc = tree[rson].rc;tree[x].c = tree[lson].c + tree[rson].c;
//      如果左儿子左端点被覆盖,那么自己的左端点也肯定被覆盖;右儿子同理if(tree[lson].rc && tree[rson].lc)tree[x].c -= 1;
//      如果做儿子右端点和右儿子左端点都被覆盖,
//      那么中间就是连续的一段,所以要 -= 1}
}
//目前遇到的扫描线题目貌似都没有pushdown函数
void edit_tree(int x, int L, int R, int c) {//维护的是[ X[tree[x].l],X[tree[x].r+1)这段的状态int l = tree[x].l, r = tree[x].r;if(X[l] >= R || X[r + 1] <= L)return;if(L <= X[l] && X[r + 1] <= R) {tree[x].sum += c;pushup(x);
//pushup也可以拆边,这里不能省略return;}edit_tree(lson, L, R, c);edit_tree(rson, L, R, c);pushup(x);
}ScanLine make_line(int l, int r, int h, int mark) {ScanLine res;res.l = l, res.r = r,res.h = h, res.mark = mark;return res;
}
//  POJ 不这样做就会CE,很难受int main()
{scanf("%d", &n);for(int i = 1; i <= n; i++) {scanf("%d %d %d %d", &x1, &y1, &x2, &y2);line[i * 2 - 1] = make_line(x1, x2, y1, 1);line[i * 2] = make_line(x1, x2, y2, -1);X[i * 2 - 1] = x1, X[i * 2] = x2;}n <<= 1;sort(line + 1, line + n + 1);sort(X + 1, X + n + 1);int tot = unique(X + 1, X + n + 1) - X - 1;build_tree(1, 1, tot - 1);//注意这里x[l],x[r]管理的是[x[l],x[r+1])这一区间的情况,所以这里是tot-1int res = 0;for(int i = 1; i < n; i++) {edit_tree(1, line[i].l, line[i].r, line[i].mark);res += abs(pre - tree[1].len);
//横边的长度是每次扫描线被覆盖线段的长度变化pre = tree[1].len;
//      统计横边res += 2 * tree[1].c * (line[i + 1].h - line[i].h);
//tree.c维护的是该区间内被覆盖线段的个数,故要*2
//      统计纵边}res += line[n].r - line[n].l;
//  特判一下枚举不到的最后一条扫描线printf("%d", res);return 0;
}

业余ACMer笔记·6月第三周补题相关推荐

  1. 5月第三周全球域名解析商Top15:万网DNSPod份额上涨

    IDC评述网(idcps.com)05月27日报道:据域名统计机构WebHosting.info数据得知,在5月第三周(5月13日-5月19日)期间,全球域名市场基本保持稳定.与上周相比,美国域名解析 ...

  2. .INFO域名总量跌破700万,8月第三周净减51,477个

    中国IDC评述网08月23日报道:近日,据WebHosting.info公布的数据显示,截至2012年8月20日,全球.INFO域名注册总量已跌破700万个,为6,976,763个,8月第二周持续负增 ...

  3. 11月第三周.COM增13.8万 ×××域名.XXX减9个

    据Registrar Stats最新实时数据,截至2013年11月22日,全球.COM域名注册总量达到了111,429,666个,环比上周增137,840万个.而亚洲顶级域名.ASIA仍深陷低潮期,环 ...

  4. 全球五大顶级域名一周统计:7月第三周新增超9万个

    中国IDC评述网07月27日报道:据域名统计机构WebHosting.info公布的最新数据显示,截至2012年7月23日,全球五大顶级域 名(.COM..NET..ORG..INFO和BIZ)总量达 ...

  5. 2月第三周各国家.NET域名排名Top10:中国第三

    中国IDC评述网02月21日报道:据WebHosting.info公布的数据显示,截至2013年02月18日,美国.NET域名注册总量为7,831,627个,在全球各国家.NET域名总量中稳居第一.德 ...

  6. 4月第三周国内域名解析商Top10:万网升至20.32%

    IDC评述网(idcps.com)04月28日报道:据WebHosting.info数据显示,4月第三周(4月15日-4月21日),我国域名解析服务市场基本保持稳定.与上周相比,中国万网份额小升0.0 ...

  7. 12月第三周各国域名总量榜:中国729万居全球第二

    IDC评述网(idcps.com)12月26日报道:根据WebHosting.info最新数据,截至2013年12月23日,中国域名总量已增至7,293,614个,仅次美国,居全球第二名,12月第三周 ...

  8. 3月第三周全球五大顶级域名总量新增11.4万个

    据国外域名统计机构WebHosting.info公布的最新数据显示,截至2012年3月19日,全球五大顶级域名 (.COM..NET..ORG..INFO和BIZ)的总量达130,368,299个.环 ...

  9. 瑞克斯外汇平台9月第三周时事(二)

    瑞克斯外汇平台9月第三周时事(二) 11.近日,国际咨询机构麦肯锡公司发布一份名为<表现优异者:高增长的新兴经济体和推动它们的企业>的报告称,从长远看,新兴经济体仍将是世界经济增长引擎. ...

  10. 2月第三周域名主机网站排名TOP15 中国万网居首

    据国际统计机构Alexa最新统计数据,在2月13日至19日一周时间内,作为国内IDC行业领跑者的中国万网的网站用户覆盖数高达1660, 比上周(1580)上升了80,发展趋势乐观.另外,在本周排行榜中 ...

最新文章

  1. LinkedList 的作者说他自己都不用 LinkedList?
  2. Mysql安装注意问题
  3. Spring quartz 并发性研究
  4. 安卓使用JNI-NDK
  5. 《阿里云互联网多媒体存储解决方案蓝皮书》震撼上线!
  6. SpringCloud基础组件总结,与Dubbo框架、SpringBoot框架对比分析
  7. Eclipse java SE版本解决无法新建web项目问题
  8. unity 3d换装之 SkinMeshRenderer
  9. 插件占坑,四大组件动态注册前奏(二) 系统Service的启动流程
  10. 2020服务器虚拟化市场容量,2020年服务器市场的五大技术和市场趋势
  11. 利用树莓派完成POS58打印机的无驱动打印(初学者)
  12. 计算Sharp夏普率的python和c++代码
  13. mysql rpm mar_Centos7.3离线(rpm方式)安装mysql服务
  14. Ant Design Pro 4 动态菜单icon丢失解决办法
  15. 一个人写一个集群:基于GRPC的golang微服务框架iogo(grpc/protobuf/etcd/freetoo/码客 卢益贵)
  16. 链表和线性表的优缺点
  17. 【Swing】JTextArea文本域组件
  18. 百度智能云区块链产品负责人刘尧:Web3.0时代加速区块链到来,具有五大特性...
  19. XXX正在运行,点按即可了解详情或停止应用
  20. 支持服务器系统什么意思,服务器系统支持

热门文章

  1. Python实现Pearson相关系数计算及公式化简过程
  2. catalina java opts,catalina.bat中适当的位置设置JAVA_OPTS
  3. struct 结构体 所占字节数的计算
  4. 显卡XP驱动 Win7驱动 NVIDIA GT520M GT525M GT540M
  5. Nik插件滤镜套装Nik Collection 3 Mac
  6. css 去掉a标签下划线,CSS 解决 a标签去掉下划线 text-decoration: none无效 的解决方案...
  7. Ubuntu18.04 下载与安装
  8. 通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
  9. 任意7个数字,选出5个进行组合排列,并使用Excel打印组合的所有情况。
  10. 二进制和十进制的转换