Submission #26515200
Source Code Expand
#include <bits/stdc++.h>
#define r(i,n) for(int i=0;i<n;i++)
using namespace std;
typedef pair<int,int>P;
#define F first
#define S second
unsigned long long xor128() {
static unsigned long long rx = 123456789, ry = 362436069, rz = 521288629, rw = 88675123;
unsigned long long rt = (rx ^ (rx << 11));
rx = ry;
ry = rz;
rz = rw;
return (rw = (rw ^ (rw >> 19)) ^ (rt ^ (rt >> 8)));
}
std::chrono::system_clock::time_point start;
std::chrono::system_clock::time_point owari;
double gettime(){
owari = std::chrono::system_clock::now();
// erapsed = ms
double elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(owari-start).count();
return elapsed;
}
struct UnionFind{
int n;
vector<int> ran,p,cnt;
UnionFind(){}
UnionFind(int sz):n(sz),ran(sz,1),p(sz,0){iota(p.begin(),p.end(),0);}
int find(int x){
return (x==p[x]?x:p[x]=find(p[x]));
}
bool same(int x,int y){
return find(x)==find(y);
}
void unite(int x,int y){
x=find(x);y=find(y);
if(x==y) return;
if(ran[x]<ran[y]) swap(x,y);
ran[x]+=ran[y];
p[y]=x;
}
int sum(int x){
return ran[find(x)];
}
};
int N,K,B;
int my[1000];
int mx[1000];
int ch[1000];
int cw[1000];
int cc[1000];
string S[100][50];
struct POINT{
int x,y,k;
};
vector<bitset<50*50> > mask_tmp,mask;
vector<POINT>mask_point;
vector<int>mask_cnt;
vector<int>mask_cost;
bitset<50*50> M;
bitset<50*50> BIT;
unordered_set<int>used;
int sum=0;
int cost = 0;
int costB = 0;
vector<int>tmp;
int ind[20000];
void INIT(){
sum = 0;
cost = 0;
BIT.reset();
for(int i=0;i<mask.size();i++) if(used.count(i)) {
if(sum == K) break;
if((BIT&mask[i]).any()) continue;
sum += mask_cnt[i];
cost += mask_cost[i];
BIT |= mask[i];
used.insert(i);
}
}
void Finsert(){
for(int i2=0;i2<mask.size();i2++){
int i=ind[i2];
if(sum == K) break;
if((BIT&mask[i]).any()) continue;
sum += mask_cnt[i];
cost += mask_cost[i];
BIT |= mask[i];
used.insert(i);
}
}
int dx[]={0,1,0,-1};
int dy[]={-1,0,1,0};
void Union(){
costB = 0;
UnionFind U(50*50);
r(i,50){
r(j,50){
if(BIT.test(i*50+j)==false)continue;
r(k,4){
int y=i+dy[k];
int x=j+dx[k];
if(y<0||x<0||y>=N||x>=N) continue;
if(BIT.test(y*50+x)==false) continue;
U.unite(y*50+x , i*50+j);
}
}
}
tmp.clear();
while(1){
set<int>st;
vector<P>sz;
r(i,2500) if(BIT.test(i)) {
st.insert(U.find(i));
}
r(i,2500) if(BIT.test(i)) {
sz.emplace_back(P(U.sum(i),i));
}
sort(sz.begin(),sz.end());
if(st.size()==1)break;
int a = U.find(sz[0].S);
int MIN = 1e9;
vector<int>pa;
int cnt=0;
queue<int>q;
unordered_map<int,int>qm;
unordered_map<int,int>path;
r(i,2500)if(U.find(i)==a){
q.push(i);
qm[i]=1;
path[i] = -1;
}
{
while(!q.empty()){
int i = q.front()/50;
int j = q.front()%50;q.pop();
r(k,4){
int y=i+dy[k];
int x=j+dx[k];
if(y<0||x<0||y>=N||x>=N) continue;
if(qm.count(y*50+x))continue;
if(MIN <= qm[i*50+j] + 1) continue;
q.push(y*50+x);
qm[y*50+x] = qm[i*50+j] + 1;
path[y*50+x] = i*50+j;
if( U.find(y*50+x)!=a && st.count(U.find(y*50+x)) ){
MIN = min(MIN,qm[y*50+x]);
int t = y*50+x;
pa.clear();
while(t!=-1){
pa.emplace_back(t);
t = path[t];
}
goto L;
}
}
}
L:;
}
for(int i=0;i<pa.size()-1;i++){
if(i)tmp.emplace_back(pa[i]);
costB++;
U.unite(pa[i],pa[i+1]);
}
costB--;
}
}
void solve(){
r(i,20000)ind[i] = i;
int maxscore = 1e9;
unordered_set<int>aused;
vector<int>atmp;
while(gettime() <= 1990){
vector<P>vect;
r(i,xor128()%100 + 50){
int a=xor128()%mask.size();
int q = xor128()%1000 +20;
int b=a+(xor128()%q)-q/2;
if(b<0)b=0;
if(b>=mask.size())b=mask.size()-1;
vect.emplace_back(P(a,b));
}
r(i,vect.size())swap(ind[vect[i].F],ind[vect[i].S]);
INIT();
//cerr<<costB*15 + cost<<endl;
Finsert();
//cerr<<costB*15 + cost<<endl;
Union();
//cerr<<costB*15 + cost<<endl<<endl<<endl;
if(maxscore > costB*15 + cost){
maxscore = costB*15 + cost;
aused = used;
atmp = tmp;
cerr<<maxscore<<endl;
}
else{
for(int i=vect.size()-1;i>=0;i--){
swap(ind[vect[i].F],ind[vect[i].S]);
}
}
used.clear();
/*vector<int>vec;
for(auto &e:used){
vec.emplace_back(e);
}
int x=xor128()% vec.size();
r(i,x){
int t=vec[xor128()%vec.size()];
used.erase(t);
}*/
}
cout<<atmp.size()+aused.size()<<endl;
for(auto &i:aused){
cout<<mask_point[i].k+1<<' '<<mask_point[i].y<<' '<<mask_point[i].x<<endl;
}
for(auto &e:atmp){
cout<<1<<' '<<e/50<<' '<<e%50<<endl;
}
}
void make(){
r(i,K){
M.set(my[i]*50 + mx[i]);
}
vector<P>vec;
int cnt=0;
vector<POINT>OOO;
r(k,B){
r(i,N-ch[k]+1){
r(j,N-cw[k]+1){
bitset<50*50> b;
r(I,ch[k]){
r(J,cw[k]){
if(S[k][I][J]!='#') continue;
b.set((i+I)*50 + j+J);
}
}
if((M&b).any() == false) continue;
mask_tmp.emplace_back(b);
vec.emplace_back(P(-(M&b).count(),cc[k]*10000 + cnt));
POINT PO;
PO.x = j;
PO.y = i;
PO.k = k;
OOO.emplace_back(PO);
cnt++;
}
}
}
sort(vec.begin(),vec.end());
r(i,vec.size()){
int cnt = vec[i].S%10000;
int ccc = vec[i].S/10000;
mask.push_back(mask_tmp[cnt]);
mask_cnt.emplace_back(vec[i].F * -1);
mask_cost.emplace_back(ccc);
mask_point.emplace_back(OOO[cnt]);
}
}
int main(){
start = std::chrono::system_clock::now();
cin>>N>>K>>B;
r(i,K){
cin>>my[i]>>mx[i];
}
r(i,B){
cin>>ch[i];
cin>>cw[i];
cin>>cc[i];
r(j,ch[i]){
cin>>S[i][j];
}
}
make();
solve();
cerr<<"EndTime: "<<gettime()<<endl;
}
Submission Info
| Submission Time |
|
| Task |
C - Polyomino Connection C |
| User |
c7c7 |
| Language |
C++ (GCC 9.2.1) |
| Score |
2067513 |
| Code Size |
5977 Byte |
| Status |
AC |
| Exec Time |
2000 ms |
| Memory |
10048 KiB |
Compile Error
./Main.cpp: In function ‘void INIT()’:
./Main.cpp:82:15: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::bitset<2500> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
82 | for(int i=0;i<mask.size();i++) if(used.count(i)) {
| ~^~~~~~~~~~~~
./Main.cpp: In function ‘void Finsert()’:
./Main.cpp:94:17: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::bitset<2500> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
94 | for(int i2=0;i2<mask.size();i2++){
| ~~^~~~~~~~~~~~
./Main.cpp: In function ‘void Union()’:
./Main.cpp:180:16: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
180 | for(int i=0;i<pa.size()-1;i++){
| ~^~~~~~~~~~~~
./Main.cpp:140:7: warning: unused variable ‘cnt’ [-Wunused-variable]
140 | int cnt=0;
| ^~~
./Main.cpp: In function ‘void solve()’:
./Main.cpp:2:29: warning: comparison of integer expressions of different signedness: ‘int’ and ‘long long unsigned int’ [-Wsign-compare]
2 | #define r(i,n) for(int i=0;i<n;i++)
......
202 | r(i,xor128()%100 + 50){
| ~~~~~~~~~~~~~~~~~~~
./Main.cpp:202:3: note: in expansion of macro ‘r’
202 | r(i,xor128()%100 + 50){
| ^
./Main.cpp:207:8: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::bitset<2500> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
207 | if(b>=mask.size())b=mask.size()-1;
| ~^~~~~~~~~~~~~
./Main.cpp:2:29: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
2 | #define r(i,n) for(int i=0;i<n;i++)
......
210 | r(i,vect.size())swap(ind[vect[i].F...
Judge Result
| Set Name |
test_ALL |
| Score / Max Score |
2067513 / 10000000000 |
| Status |
|
| Set Name |
Test Cases |
| test_ALL |
test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt |
| Case Name |
Status |
Exec Time |
Memory |
| test_0000.txt |
AC |
2000 ms |
9716 KiB |
| test_0001.txt |
AC |
1995 ms |
9780 KiB |
| test_0002.txt |
AC |
1995 ms |
10012 KiB |
| test_0003.txt |
AC |
1995 ms |
9872 KiB |
| test_0004.txt |
AC |
1994 ms |
10000 KiB |
| test_0005.txt |
AC |
1995 ms |
9672 KiB |
| test_0006.txt |
AC |
1994 ms |
9648 KiB |
| test_0007.txt |
AC |
1995 ms |
10016 KiB |
| test_0008.txt |
AC |
1994 ms |
9620 KiB |
| test_0009.txt |
AC |
1994 ms |
10004 KiB |
| test_0010.txt |
AC |
1996 ms |
9624 KiB |
| test_0011.txt |
AC |
1994 ms |
9752 KiB |
| test_0012.txt |
AC |
1995 ms |
10012 KiB |
| test_0013.txt |
AC |
1995 ms |
10004 KiB |
| test_0014.txt |
AC |
1996 ms |
9740 KiB |
| test_0015.txt |
AC |
1994 ms |
9680 KiB |
| test_0016.txt |
AC |
1997 ms |
9964 KiB |
| test_0017.txt |
AC |
1995 ms |
9724 KiB |
| test_0018.txt |
AC |
1997 ms |
10044 KiB |
| test_0019.txt |
AC |
1994 ms |
9860 KiB |
| test_0020.txt |
AC |
1996 ms |
9716 KiB |
| test_0021.txt |
AC |
1994 ms |
9740 KiB |
| test_0022.txt |
AC |
1995 ms |
9736 KiB |
| test_0023.txt |
AC |
1995 ms |
9940 KiB |
| test_0024.txt |
AC |
1995 ms |
9780 KiB |
| test_0025.txt |
AC |
1994 ms |
9884 KiB |
| test_0026.txt |
AC |
1995 ms |
9696 KiB |
| test_0027.txt |
AC |
1995 ms |
9664 KiB |
| test_0028.txt |
AC |
1994 ms |
9728 KiB |
| test_0029.txt |
AC |
1994 ms |
9684 KiB |
| test_0030.txt |
AC |
1995 ms |
9740 KiB |
| test_0031.txt |
AC |
1999 ms |
9936 KiB |
| test_0032.txt |
AC |
1994 ms |
9604 KiB |
| test_0033.txt |
AC |
1995 ms |
10016 KiB |
| test_0034.txt |
AC |
1994 ms |
9716 KiB |
| test_0035.txt |
AC |
1993 ms |
9676 KiB |
| test_0036.txt |
AC |
1996 ms |
10040 KiB |
| test_0037.txt |
AC |
1994 ms |
9676 KiB |
| test_0038.txt |
AC |
1995 ms |
10048 KiB |
| test_0039.txt |
AC |
1995 ms |
9936 KiB |
| test_0040.txt |
AC |
1995 ms |
10016 KiB |
| test_0041.txt |
AC |
1995 ms |
9716 KiB |
| test_0042.txt |
AC |
1995 ms |
9712 KiB |
| test_0043.txt |
AC |
1995 ms |
9668 KiB |
| test_0044.txt |
AC |
1994 ms |
9984 KiB |
| test_0045.txt |
AC |
1995 ms |
10048 KiB |
| test_0046.txt |
AC |
1994 ms |
9776 KiB |
| test_0047.txt |
AC |
1994 ms |
10040 KiB |
| test_0048.txt |
AC |
1996 ms |
9664 KiB |
| test_0049.txt |
AC |
1995 ms |
10012 KiB |