SGU 121

题意:给你一张图,问你每个顶点必须有黑白两条边(如果它的边数>=2),问你怎么染色,不行就输出no

收获:你会发现不行的情况只有一个单纯的奇数环的时候,反之我们交替染色即可

#include<bits/stdc++.h>
#define de(x) cout<<#x<<"="<<x<<endl;
#define dd(x) cout<<#x<<"="<<x<<" ";
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define repd(i,a,b) for(int i=a;i>=(b);--i)
#define repp(i,a,b,t) for(int i=a;i<(b);i+=t)
#define ll long long
#define mt(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pdd pair<double,double>
#define pdi pair<double,int>
#define mp(u,v) make_pair(u,v)
#define sz(a) (int)a.size()
#define ull unsigned long long
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define qc std::ios::sync_with_stdio(false)
#define db double
#define all(a) a.begin(),a.end()
const int mod = 1e9+;
const int maxn = 2e2+;
const double eps = 1e-;
using namespace std;
bool eq(const db &a, const db &b) { return fabs(a - b) < eps; }
bool ls(const db &a, const db &b) { return a + eps < b; }
bool le(const db &a, const db &b) { return eq(a, b) || ls(a, b); }
ll gcd(ll a,ll b) { return a==?b:gcd(b%a,a); };
ll lcm(ll a,ll b) { return a/gcd(a,b)*b; }
ll kpow(ll a,ll b) {ll res=; if(b<) return ; for(;b;b>>=){if(b&)res=res*a;a=a*a;}return res;}
ll read(){
ll x=,f=;char ch=getchar();
while (ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,x;
bool vis[maxn][maxn];
int ans[maxn][maxn];
int in[maxn];
vector<int> G[maxn];
//不行的情况就是存在一个单纯的奇数环
//奇数环加上一些边的话,要从奇度顶点开始dfs
void dfs(int u,int col){
rep(i,,sz(G[u])){
int v = G[u][i];
if(vis[u][v]) continue;
vis[u][v] = vis[v][u] = true;
ans[u][v] = ans[v][u] = col;
dfs(v,col^); col^=;
}
}
bool ok(){
set<int> s;
rep(u,,n+){
s.clear();
if(in[u] < ) continue;
rep(i,,sz(G[u])){
int v = G[u][i];
s.insert(ans[u][v]);
}
if(sz(s) < ) return false;
}
return true;
}
int main(){
scanf("%d",&n);
rep(i,,n+) {
while(scanf("%d",&x)&&x){
G[i].pb(x);
in[x]++;
}
}
rep(i,,n+) if(in[i] > && (in[i] & )) dfs(i,);
rep(i,,n+) dfs(i,);
if(!ok()) return puts("No solution"),;
rep(u,,n+){
rep(i,,sz(G[u])){
int v = G[u][i];
printf("%d ",ans[u][v]?:);
}
puts("");
}
return ;
}

SGU 148

题意:n层的东西,每一层有wi,li,pi分别表示i层当前的水量,和最大容纳量,和破坏i层的费用,如果破坏i层的话,花费pi,水会流到下一层,

或者你当前层的水超过了li的话他就会自动破坏,然后问你要破坏第n层的最小费用

收获:我们知道一层的话要被破坏,他有两种方法,一种就是直接花费pi,一种就是上面留下来的水加上自己的超过了自己的容量(这样的话就不用加上这一层的费用了)

然后你如果从第i层开始破坏到第n层的话,i 到 n所有层都要破,那么花费就是pre[j] - pre[i - 1] <=  l[j] (j >= i) 的那些p[j]的和,因为这些j是不能被上面的i 到 j的水打破的,我们就要手动打破它,

看看这个公式,我们可以变成这样pre[j] - l[j] <= pre[i-1],那么我们从n开始枚举我们i的话,如果(j >= i) pre[j] - l[j] > pre[i]的话,这个j就可以被自动打破,那么我们就可以从费用中减去p[j]这个东西

然后每次更新答案,那么就可以把所有的pre[j] - l[j]存到一个最大堆里面,然后每次枚举到的i,判断是否q.top().fi > pre[i-1],那么我们就可以把它的p[j]减掉了

#include<bits/stdc++.h>
#define de(x) cout<<#x<<"="<<x<<endl;
#define dd(x) cout<<#x<<"="<<x<<" ";
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define repd(i,a,b) for(int i=a;i>=(b);--i)
#define repp(i,a,b,t) for(int i=a;i<(b);i+=t)
#define ll long long
#define mt(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pdd pair<double,double>
#define pdi pair<double,int>
#define mp(u,v) make_pair(u,v)
#define sz(a) (int)a.size()
#define ull unsigned long long
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define qc std::ios::sync_with_stdio(false)
#define db double
#define all(a) a.begin(),a.end()
const int mod = 1e9+;
const int maxn = 2e4+;
const double eps = 1e-;
using namespace std;
bool eq(const db &a, const db &b) { return fabs(a - b) < eps; }
bool ls(const db &a, const db &b) { return a + eps < b; }
bool le(const db &a, const db &b) { return eq(a, b) || ls(a, b); }
ll gcd(ll a,ll b) { return a==?b:gcd(b%a,a); };
ll lcm(ll a,ll b) { return a/gcd(a,b)*b; }
ll kpow(ll a,ll b) {ll res=; if(b<) return ; for(;b;b>>=){if(b&)res=res*a;a=a*a;}return res;}
ll read(){
ll x=,f=;char ch=getchar();
while (ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n;
int w[maxn],l[maxn],p[maxn];
int pre[maxn];
bool used[maxn];
priority_queue<pii>q;
int main(){
scanf("%d",&n);
rep(i,,n+) scanf("%d%d%d",&w[i],&l[i],&p[i]),pre[i] = pre[i-] + w[i];
int sum = , ans = inf, pos;
repd(i,n,){
while(sz(q) && q.top().fi > pre[i-]) sum -= q.top().se, q.pop();
q.push(mp(pre[i]-l[i],p[i]));
sum += p[i];
if(sum < ans) ans = sum, pos = i;
}
rep(i,pos,n+) if(pre[i] - pre[pos-] <= l[i]) used[i] = true;
rep(i,,n+) if(used[i]) printf("%d\n",i);
return ;
}

SGU 355

题意:给一个数字N,要你给数字1 到 N染色,要求是如果a % b == 0 的话,

a和b的颜色不能相同,问你最多用多少的颜色

收获:暴力,找出他所有的因子的染的颜色,然后用set去重,然后那个数的染色就是set的大小 + 1,

证明呢。。我做的时候没去想为什么这个就是合理的,就莽了一发就A了,

然后我去想了为什么,我的理解是:
一个数的所有因子都不存在互质的话,那么不就是最坏的情况了,它只能染成因子数量 + 1了,sz就是因数颜色种类大小,那么如果有存在因子互质的话的,

有一对的话,那么它染色的是不是就可以减一,每次用最小的去染色,那么它的因子的染色肯定是从1 开始 到 sz

#include<bits/stdc++.h>
#define de(x) cout<<#x<<"="<<x<<endl;
#define dd(x) cout<<#x<<"="<<x<<" ";
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define repd(i,a,b) for(int i=a;i>=(b);--i)
#define repp(i,a,b,t) for(int i=a;i<(b);i+=t)
#define ll long long
#define mt(a,b) memset(a,b,sizeof(a))
#define fi first
#define se second
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define pii pair<int,int>
#define pdd pair<double,double>
#define pdi pair<double,int>
#define mp(u,v) make_pair(u,v)
#define sz(a) (int)a.size()
#define ull unsigned long long
#define ll long long
#define pb push_back
#define PI acos(-1.0)
#define qc std::ios::sync_with_stdio(false)
#define db double
#define all(a) a.begin(),a.end()
const int mod = 1e9+;
const int maxn = 1e4+;
const double eps = 1e-;
using namespace std;
bool eq(const db &a, const db &b) { return fabs(a - b) < eps; }
bool ls(const db &a, const db &b) { return a + eps < b; }
bool le(const db &a, const db &b) { return eq(a, b) || ls(a, b); }
ll gcd(ll a,ll b) { return a==?b:gcd(b%a,a); };
ll lcm(ll a,ll b) { return a/gcd(a,b)*b; }
ll kpow(ll a,ll b) {ll res=; if(b<) return ; for(;b;b>>=){if(b&)res=res*a;a=a*a;}return res;}
ll read(){
ll x=,f=;char ch=getchar();
while (ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n;
int ans[maxn];
set<int> s;
int main(){
scanf("%d",&n);
int mx = ;
ans[] = ;
rep(i,,n+){
s.clear();
for(int j = ;j*j<=i;++j){
if(i%j==){
s.insert(ans[j]);
if(i/j != j) s.insert(ans[i/j]);
}
}
ans[i] = sz(s) + ;
mx = max(mx,ans[i]);
}
printf("%d\n",mx);
rep(i,,n+) printf("%d%c",ans[i]," \n"[i==n]);
return ;
}

今日SGU 5.28的更多相关文章

  1. 今日SGU 6.6

    sgu 177 题意:给你一个一开始全是白色的正方形,边长为n,然后问你经过几次染色之后,最后的矩形里面 还剩多少个白色的块 收获:矩形切割,我们可以这么做,离散处理,对于每次染黑的操作,看看后面有没 ...

  2. 今日SGU 6.5

    sgu 160 题意:给你n个数字 数字范围 1 到 m 问你从中取出任意数量的数字使得这些数字的积取模m最大 收获:dp,记录dp的路径 #include<bits/stdc++.h> ...

  3. 今日SGU 5.30

    SGU 190 题意:给你个n*n的矩形,然后上面有几个点不能放东西,然后问你能不能用1*2的矩形,把能放 东西的地方放满 收获:一开始想的是,dfs,然后感觉这样的话,代码很长,而且很容易超时, 看 ...

  4. 今日SGU 5.29

    sgu 299 题意:给你n个线段,然后问你能不能选出其中三个组成一个三角形,数字很大 收获:另一个大整数模板 那么考虑下为什么如果连续三个不可以的话,一定是不存在呢? 连续上个不合法的话,一定是 a ...

  5. 今日SGU 5.27

    SGU 122 题意:给你n个人,每个人有大于 N / 2(向上取整)的朋友,问你1这个人有一个书,每个人都想看,只能从朋友之间传递,然后最后回到了1这个人,问你 是否有解,然后有解输出路径 收获:哈 ...

  6. 今日SGU 5.26

    #include<bits/stdc++.h> #define de(x) cout<<#x<<"="<<x<<endl ...

  7. 今日SGU 5.25

    SGU 194 题意:无源汇有上下界的最大流 收获:https://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html #include<bit ...

  8. 今日SGU 5.23

    SGU 223 题意:给你n*n的矩形,放k个国王,每个国王不能放在别的国王的8连边上,问你有多少种方法 收获:状态DP,因为每行的放置只会影响下一行,然我们就枚举每行的状态和对应的下一行的状态,当两 ...

  9. 今日SGU 5.22

    SGU 296 题意:给你一个最多1000位的数,让你删除k位使得剩下的数最大 收获:贪心 #include<bits/stdc++.h> #define de(x) cout<&l ...

随机推荐

  1. java 获取线程id

    如何获取正在运行的线程的ID? 解决方法 下面的示例演示如何使用getThreadId() 方法一个正在运行线程的ID. public class Main extends Object implem ...

  2. Dispatch Groups

    Dispatch Groups are objects that allow several tasks to be grouped for later joining. Tasks can be a ...

  3. java开发过程中几种常用算法

    排序算法 排序算法中包括:简单排序.高级排序 简单排序 简单排序常用的有:冒泡排序.选择排序.插入排序 冒泡排序代码如下: private static void bubbleSrot(int[] a ...

  4. Python学习---Day96

    转载:http://www.cnblogs.com/wupeiqi/articles/6229292.html Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可 ...

  5. 关于Python的装饰器

    false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {m ...

  6. ajax同时提交表单且包含文件

    说明一下:FormData对象是html5的一个对象,目前的一些主流的浏览器都已经兼容.ie8暂时不支持,不支持FormData的,可以使用方法二,下面会介绍.接着说FormData,它是一个html ...

  7. HDU-1358 Period 字符串问题 KMP算法 求最小循环节

    题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提 ...

  8. virtual box虚拟机在linux下设置共享文件夹

    使用的虚拟机版本是:VirtualBox-5.2.8-121009 使用的linux版本是:Ubuntu 12.04.5 LTS 和 Linux Mint 19 Tara 1. 安装增强功能包(Gue ...

  9. win7休眠的开启与关闭方法命令行操作和图文结合的鼠标操作

    win7休眠的开启与关闭方法 从開始菜单中找到"附件→命令提示符",手工输入例如以下命令:powercfg -a.从这里能够清楚的看到,计算机是支持休眠的.显示"尚未启用 ...

  10. 第二章 Linux常用命令

    1.命令基础 命令格式:  命令名  [选项] [参数1] [参数2] 命令必须小写,命令正常执行后返回一个0,表示执行成功,如果执行出错,就反悔一个非零值 2.简单的几个命令  who:列出所有正在 ...