Submission #541656

#TimeUsernameProblemLanguageResultExecution timeMemory
541656colazcyParalelogrami (COCI17_paralelogrami)C++17
0 / 140
1090 ms212 KiB
#include <cstdio> #include <cassert> #include <cctype> #include <vector> #include <tuple> #include <algorithm> #define let const auto #define rep(name,beg,end) for(auto lim_##name = end,name = beg;name <= lim_##name;name++) #define per(name,beg,end) for(auto lim_##name = end,name = beg;name >= lim_##name;name--) #define repn(lim) for(auto REPN_lIM = lim,REPN = 1;REPN <= REPN_lIM;REPN++) #define debug(...) fprintf(stderr,__VA_ARGS__) #define trace() debug("line : %d, Function : %s\n",__LINE__,__FUNCTION__) constexpr int maxn = 433; int read(){ int x = 0,f = 1; char c = std::getchar(); while(!std::isdigit(c))f = c == '-' ? -1 : 1,c = std::getchar(); while(std::isdigit(c))x = x * 10 + c - '0',c = std::getchar(); return x * f; } std::vector<std::tuple<int,int,int>> ans; int n; struct Point{ int x,y; Point operator - (const Point &t)const{return Point{x - t.x,y - t.y};} int operator * (const Point &t)const{ return x * t.y - y * t.x; } int h()const{ return (x + 10) * 21 + (y + 10); } }p[maxn]; Point nxt(const Point a,const Point b,const Point c){ return Point{a.x + b.x - c.x,a.y + b.y - c.y}; } bool chk(const Point a,const Point b,const Point c){ return !(((b - a) * (c - a) == 0) && ((a - b) * (c - b) == 0) && ((a - c) * (b - c) == 0)); } void oper(const int a,const int b,const int c){ ans.emplace_back(a,b,c); assert(ans.size() <= 2500); p[c] = nxt(p[a],p[b],p[c]); } int main(){ // std::freopen("paralelogrami.in","r",stdin); // std::freopen("paralelogrami.out","w",stdout); std::scanf("%d",&n); rep(i,1,n)std::scanf("%d %d",&p[i].x,&p[i].y); int a = -1,b = -1,c = -1; rep(i,1,n) rep(j,i + 1,n) rep(k,j + 1,n) if(chk(p[i],p[j],p[k])){ a = i; b = j; c = k; goto ed; } ed: if(a == -1){ std::puts("-1"); return 0; } while(true){ if(p[a].x >= 20 && p[b].x >= 20 && p[c].x >= 20 && p[a].y >= 20 && p[b].y >= 20 && p[c].y >= 20)break; let mix = std::min({p[a].x,p[b].x,p[c].x}); let miy = std::min({p[a].y,p[b].y,p[c].y}); { let pa = p[a]; let pb = p[b]; let pc = nxt(p[a],p[b],p[c]); let nmix = std::min({pa.x,pb.x,pc.x}); let nmiy = std::min({pa.y,pb.y,pc.y}); if(nmix >= mix && nmiy >= miy && (nmix > mix || nmiy > miy)){ oper(a,b,c); continue; } } { let pa = p[a]; let pb = nxt(p[a],p[c],p[b]); let pc = p[c]; let nmix = std::min({pa.x,pb.x,pc.x}); let nmiy = std::min({pa.y,pb.y,pc.y}); if(nmix >= mix && nmiy >= miy && (nmix > mix || nmiy > miy)){ oper(a,c,b); continue; } } { let pa = nxt(p[b],p[c],p[a]); let pb = p[b]; let pc = p[c]; let nmix = std::min({pa.x,pb.x,pc.x}); let nmiy = std::min({pa.y,pb.y,pc.y}); if(nmix >= mix && nmiy >= miy && (nmix > mix || nmiy > miy)){ oper(b,c,a); continue; } } } rep(i,1,n) if(i != a && i != b && i != c){ if(chk(p[a],p[b],p[i]))oper(a,b,i); else if(chk(p[b],p[c],p[i]))oper(b,c,i); else if(chk(p[a],p[c],p[i]))oper(a,c,i); } rep(i,1,n) assert(p[i].x >= 0), assert(p[i].y >= 0); std::printf("%d",(int)ans.size()); for(let &t : ans) std::printf("%d %d %d\n",std::get<0>(t),std::get<1>(t),std::get<2>(t)); // std::fclose(stdin); // std::fclose(stdout); return 0; }

Compilation message (stderr)

paralelogrami.cpp: In function 'int main()':
paralelogrami.cpp:49:12: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |  std::scanf("%d",&n);
      |  ~~~~~~~~~~^~~~~~~~~
paralelogrami.cpp:50:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |  rep(i,1,n)std::scanf("%d %d",&p[i].x,&p[i].y);
      |            ~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...