SDOI Day2
今天做了SDOI Day2 觉得自己萌萌哒= =题目真的有点水,一点编程复杂度都没有
T1:星际战争
描述:http://www.lydsy.com/JudgeOnline/problem.php?id=3993
这道题是这两天最容易的题了吧。。
可以发现这是一个二分图,考虑二分答案,那么人们在这段时间的输出伤害就能够确定了,用最大流判断是否所有的机器人护甲值都为0,即可。
数据较良心跑得飞快
Code:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 105
#define maxm 3000
struct edges{
int to,next;double cap;
}edge[maxm*];
int l,next[maxn];
inline void addedge(int x,int y,double z) {
l++;
edge[l*]=(edges){y,next[x],z};next[x]=l*;
edge[l*+]=(edges){x,next[y],};next[y]=l*+;
}
int p[maxn],gap[maxn],h[maxn],s,t;
double sap(int u,double flow) {
if (u==t) return flow;
double cnt=;
for (int i=p[u];i;i=edge[i].next)
if (edge[i].cap&&h[edge[i].to]+==h[u]) {
double cur=sap(edge[i].to,min(flow-cnt,edge[i].cap)) ;
edge[i].cap-=cur;edge[i^].cap+=cur;
p[u]=i;
if ((cnt+=cur)==flow) return flow;
}
if (!(--gap[h[u]])) h[s]=t;
gap[++h[u]]++;
p[u]=next[u];
return cnt;
}
inline double maxflow(){
for (int i=;i<=t;i++) p[i]=next[i];
memset(h,,sizeof(h));
memset(gap,,sizeof(gap));
gap[]=t;
double flow=;
while (h[s]<t) flow+=sap(s,1e7);
return flow;
}
int a[maxn],b[maxn];
bool c[maxn][maxn];
int n,m;
inline void build(double mid){
l=;
s=n+m+,t=n+m+;
memset(next,,sizeof(next));
for (int i=;i<=n;i++) addedge(s,i,mid*a[i]);
for (int i=;i<=m;i++) addedge(i+n,t,b[i]);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
if (c[i][j]) addedge(i,j+n,5e6);
}
int main(){
scanf("%d%d",&m,&n);
int sum=;
for (int j=;j<=m;j++) {
scanf("%d",b+j);sum+=b[j];
}
for (int i=;i<=n;i++) scanf("%d",a+i);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++) scanf("%d",c[i]+j);
double l=,r=5e6;
while (r-l>1e-) {
double mid=(l+r)/;
build(mid);
if (maxflow()<sum) l=mid;
else r=mid;
}
printf("%lf\n",r);
return ;
}
T2:约数个数和
描述:http://www.lydsy.com/JudgeOnline/problem.php?id=3994
数论渣= =贴下别人的题解吧= =http://blog.codebursts.com/bzoj3994/
顺便说一下自己YY出来的另一种解法,记f[i][j][k]为n=i,m=j中n*m的最小质因数大于pri[k]的答案
那么f[i][j][k]=sigma(f[i/(x^a)][j/(x^b)][k+1]*(a+b+1))
好像很漂亮的样子,但是时间复杂度我不知道怎么样,求大神給我解答QAQ
T3:道路修建
描述:http://www.lydsy.com/JudgeOnline/problem.php?id=3995
看到这个下意识就想到线段树了= =
一共有3种解法
解法一:当合并区间时,连上两条边变成一个环套树,然后删去环上最大的边
我们考虑维护每个区间最左右的一个类似C型结构,可以发现只有当删去的边为纵边同时这个小区间只有一条纵边时大区间的这个东西才会改变,否则都是小区间的左右值。
保存左右两边C的横边最大值以及纵边最大值还有纵边数量即可
解法二:考虑直接生成新区间的树
可以发现这个区间只有可能是或
那么怎么维护这个联通块—联通块的问题呢= =
有3种情况= =
或还有
然后考虑怎么维护联通块—联通块—联通块的问题了= =
我去这怎么办啊
据某位同学透露,这个一共只有3种情况所以可以直接维护(我去我怎么搞出了超多种情况= =,但人家还真的a了而且跑得飞快= =)
具体的实现方法可以私信我
解法三:
可以看出,可能成为树的是该区间的所有点都和暴露在外面的四个点之一相连,所以我们可以考虑用联通性的方法来解决这道题
枚举所有的联通性并考虑转移,还是能写的= =
时间上就有点拙计了
Code:(解法一)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 60010
struct bo{
int c[],cost,mx[][];bool flag;
};
inline bo update(bo x,bo y){
bo ans;
ans.c[]=y.c[];
ans.c[]=y.c[];
ans.cost=x.cost+y.cost+x.c[]+x.c[];
ans.mx[][]=x.mx[][],ans.mx[][]=x.mx[][];
ans.mx[][]=y.mx[][],ans.mx[][]=y.mx[][];
int tmp=max(max(x.mx[][],y.mx[][]),max(x.c[],x.c[]));
if (tmp>=max(x.mx[][],y.mx[][])) {
ans.cost-=tmp;ans.flag=;return ans;
}
ans.flag=x.flag&y.flag;
if (x.mx[][]>y.mx[][]) {
ans.cost-=x.mx[][];
if (x.flag) {
ans.mx[][]=max(ans.mx[][],tmp);
ans.mx[][]=y.mx[][];
}
return ans;
}
ans.cost-=y.mx[][];
if (y.flag) {
ans.mx[][]=max(ans.mx[][],tmp);
ans.mx[][]=x.mx[][];
}
return ans;
} int a[maxn][];
struct node{
int l,r;bo b;
}t[maxn*];
#define mid ((l+r)>>1)
#define lc (x<<1)
#define rc (lc^1)
void build(int x,int l,int r){
t[x].l=l;t[x].r=r;
if (l==r) {
t[x].b.c[]=a[l][];
t[x].b.c[]=a[l][];
t[x].b.cost=a[l][];
t[x].b.flag=;
memset(t[x].b.mx,,sizeof(t[x].b.mx));
t[x].b.mx[][]=t[x].b.mx[][]=a[l][];
return ;
}
build(lc,l,mid);build(rc,mid+,r);
t[x].b=update(t[lc].b,t[rc].b);
}
void set(int x,int y){
int l=t[x].l,r=t[x].r;
if (l>y||r<y) return ;
if (l==r) {
t[x].b.c[]=a[l][];
t[x].b.c[]=a[l][];
t[x].b.cost=a[l][];
t[x].b.flag=;
memset(t[x].b.mx,,sizeof(t[x].b.mx));
t[x].b.mx[][]=t[x].b.mx[][]=a[l][];
return ;
}
set(lc,y);set(rc,y);
t[x].b=update(t[lc].b,t[rc].b);
}
bo query(int x,int x1,int y1) {
int l=t[x].l,r=t[x].r;
if (x1<=l&&r<=y1) return t[x].b;
if (y1<=mid) return query(lc,x1,y1);
if (mid<x1) return query(rc,x1,y1);
return update(query(lc,x1,y1),query(rc,x1,y1));
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for (int i=;i<n;i++) scanf("%d",&a[i][]);
for (int i=;i<n;i++) scanf("%d",&a[i][]);
for (int i=;i<=n;i++) scanf("%d",&a[i][]);
build(,,n);
while (m--) {
char opt[];
int x0,x1,y0,y1,z;
bo x,y;
scanf("%s",opt);
switch (opt[]) {
case 'Q' :
scanf("%d%d",&x1,&y1);
printf("%d\n",query(,x1,y1).cost);
break;
case 'C':
scanf("%d%d%d%d%d",&x0,&y0,&x1,&y1,&z);
if (y0>y1) swap(y0,y1);
if (y0==y1) a[y0][]=z;
else a[y0][x0-]=z;
set(,y0);
break;
}
}
return ;
}
SDOI Day2的更多相关文章
- 【BZOJ 4517】【SDOI 2016 Round1 Day2 T2】排列计数
本蒟蒻第一次没看题解A的题竟然是省选$Round1$ $Day2$ $T2$ 这道组合数学题. 考试时一开始以为是莫队,后来想到自己不会组合数的一些公式,便弃疗了去做第三题,,, 做完第三题后再回来看 ...
- 【BZOJ 4518】【SDOI 2016 Round1 Day2 T3】征途
比较明显的斜率优化DP,省选时因为时间太紧张和斜率DP写得不熟等原因只写了60分的暴力DP,其实当时完全可以对拍来检验标算的正确,但是我当时too naive- 很快打完了,调了将近一晚上QAQ,因为 ...
- SDOI 2016 Round1 Day2
生成魔咒 /* 后缀数组+双向链表 参照:https://blog.csdn.net/clove_unique/article/details/53911757 */ #include<cstd ...
- SDOI 2019 R1游记
$SDOI$ $2019$ $R1$游记 昨天才刚回来,今天就来写游记啦! Day -5: 做了一下去年省选的Day1,感觉很神仙. Day -4: 做了一下去年省选的Day2,感觉还是很神仙. Da ...
- SDOI 二轮垫底鸡
SDOI 二轮垫底鸡 day0 准备爆零 没啥好准备考试的,12.00出发,试机敲抄个ntt,在宾馆不知道颓啥. day1 爆零爬山 T1noip的题目也放到省选上. 第一档线段树?肯定不写,直接上1 ...
- 【从零开始学BPM,Day2】默认表单开发
[课程主题]主题:5天,一起从零开始学习BPM[课程形式]1.为期5天的短任务学习2.每天观看一个视频,视频学习时间自由安排. [第二天课程] Step 1 软件下载:H3 BPM10.0全开放免费下 ...
- NOIp2016 Day1&Day2 解题报告
Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...
- day2
三级菜单: ))))))))))] last_levels.pop() ]]]]]]]]:] information = : ch = msvcrt.getch() ][][: : password= ...
- java day2一个模拟双色球的代码
package day2; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt ...
随机推荐
- Leetcode 182. Duplicate Emails
Write a SQL query to find all duplicate emails in a table named Person. +----+---------+ | Id | Emai ...
- 每个Javascript开发者都应当知道的那些事
每个Javascript开发者都应当知道的那些事 2015-06-07 前端大全 (点击上方蓝字,可快速关注我们) Javascript是一种日益增长的语言,特别是现在ECMAScript规范按照每年 ...
- ubuntu 如何卸载重装docker
卸载 docker sudo docker -v sudo apt-get remove docker sudo apt-get remove --auto-remove docker sudo ap ...
- javah编译class文件找不到android.app.Activity的类文件
在android工程的根目录使用javah生成jni 头文件时候,报找不到android.app.Activity的类文件错误. 无法访问android.app.Activity是说明没有引入andr ...
- 创建sqlserver函数
CREATE FUNCTION getsort (@first varchar(100),@second varchar(100))RETURNS intASBEGIN declare @rv in ...
- oracle系列--解锁数据库
一.安装完成后解锁Scott数据库步骤: 进入SQL Plus 请输入用户名:sys输入口令:sys as sysdba //这里的口令是不可见的,注意空格SQL> alter user sc ...
- 把windows的bat用好了,也很不错
taskkill /f /t /im nginx.exe cp2nginx xcopy /e /i /y “D:\workspace\workspace1\aff\WebContent” “D:\ng ...
- js架构设计模式——前端MVVM框架设计及实现(一)
前端MVVM框架设计及实现(一) 最近抽出点时间想弄个dom模块化的模板引擎,不过现在这种都是MVVM自带的,索性就想自己造轮子写一个简单的MVVM框架了 借鉴的自然还是从正美的avalon开始了,我 ...
- js控制href内容的连接内容的变化
html: <a data-toggle="modal" href="#myModal_devices" id="check_devices&q ...
- TIMESTAMP和DATETIME哪个好
日期范围 TIMESTAMP 支持从'1970-01-01 00:00:01′ 到 '2038-01-19 03:14:07′ UTC. 这个时间可能对目前正在工作的人来说没什么问题,可以坚持到我们退 ...